

sunski34
Members-
Posts
753 -
Joined
-
Last visited
Content Type
Profiles
Forums
Events
Everything posted by sunski34
-
[NEW Script] Advanced Tools for Mission Editor
sunski34 replied to sunski34's topic in Mission Editor
Spawn infantry and rescue group : embark/disembark Hi, here is a new small mission using ATME_Rescue.lua standard module. This module supports French and English messages for F10 menus. In that case, ATME starts in English. This mission has 2 clients helicopters (you can add more if you want), multiplayer compatible of course. 2 infantry groups has been created too, "rescue 1" and "origin". "origin" is late activation because it is spawned as "rescue 2" group when ATME starts. 2 DCS zones one for the pickup zone "myZone" and one for the spawn zone "spawnZone". So "rescue 2" is spawned somewhere in zone "spawnZone". If you look at triggers, you will see that ATME generic modules ATME_CoreV111.lua and ATME_Rescue.lua are loaded. Then ATME_testRescue.lua, the mission module is loaded. When starting mission, you will see a F10 submenu "Personnel carrier". Then inside an item "Load group" to load a group. A group can embark only if : it's an infantry group only the distance between group and helicopter is less than 200m the group is ready to board A group is ready to board when : using changeReadToBoard(true) function of ATME.C_Group using setPickupZone(zoneName, random) function of ATME.C_Group like in this mission (see lines 38 to 43 in ATME_testRescue.lua file) : local function onCreateGroup(_group) if _group:getName() == "rescue1" or _group:getName() == "rescue2" then _group:setPickupZone("myZone", 0.7) _group:setSignal(200, "SIGNAL_SMOKE RED") _group:setWaypointsTracking(true) end end in fact just the function above is necessary for embark/disembark. the function setSignal of ATME.C_Group is useful to activate a smoke if helicopter is less then 200m in that case (but you can change it of course). If several groups have the same pickup zone and signal activated too, only one smoke is fired until at a time. If group is destroy or loaded, another group then fire new smoke. You can fire flares too. Be careful, the route of the infantry groups have to pass through the pickup zone like in this mission. You will see that waypoint tracking is activated... messages will appear when groups pass waypoints. You can delete the line 42 to desactivate waypoint tracking This function below is just necessary to send messages when groups pass waypoints : local function onTimer(events) for _id, _ in events:pairs() do if events:isCoreEvent(_id) == true then thisModule:output(events:getCoreEventType(_id), 1) if events:getCoreEventType(_id) == "TRACKING_WAYPOINT" or events:getCoreEventType(_id) == "TRACKING_LAST_WAYPOINT" then local datas = events:getCoreEventDatas(_id) if events:getCoreEventType(_id) == "TRACKING_WAYPOINT" then thisModule:output("Group " .. datas.group:getName() .. " passe au waypoint..." .. datas.idWaypoint,1) else thisModule:output("Group " .. datas.group:getName() .. " est au dernier waypoint...",1) end local pos = datas.point if ATME.isPoint(pos) ~= POINT_BAD then local lat, lon, alt = ATME.convertPointToLL(pos) local dirlat, dlat, mlat, slat = ATME.convertToDMS(lat, false) local dirlon, dlon, mlon, slon = ATME.convertToDMS(lon, false) local dirtextlat = "E" if dirlat == -1 then dirtextlat = "W" end local dirtextlon = "N" if dirlon == -1 then dirtextlon = "S" end thisModule:output("lon = " .. string.format("%s%02d.%02d.%02d", dirtextlon, dlon, mlon, slon) .. "\nlat = " .. string.format("%s%03d.%02d.%02d", dirtextlat, dlat, mlat, slat), 1) end end end end end So now, start the mission, take an helicopter. Wait groups stop, then they are ready to board. F10 "Personnel carrier" then "Load group". You can load several groups depending of their nb of units (see doc for further informations, load fonction of ATME.C_Player class). You can load a second group if you want. Then after message "Group xxx on board", you will see 2 menu items "Unload rescue 1" and "Unload rescue 2", choose the group to disembark... That all, then the groups cannot be reload and follow their route because they aren't ready to board. Of course you can set that again by script. If you want to test more, put groups, dcs zones "myZone" and "spawnZone" in another place, not too far, augment the radius of signal zone to 5000 (5km). the distance between groups and helicopter must be > 5km if you want to see when the smoke starts. If less, the smoke starts when helicopter takes off. It's the same if you take off before boarding groups in my mission. Hope that help. Enjoy ATME Sunski ATME_testRescue.lua test newRescue.miz -
Bonjour, j'ai mis à jour une version ATME ce jour. Il s'agit d'une version majeure V1.1.X. La description en français a été mise à jour https://forums.eagle.ru/showpost.php?p=3001633&postcount=1 avec le lien associé pour le téléchargement, il reste encore à faire la documentation associée en français. Vous pouvez cependant aller sur le lien en anglais pour plus d'infos. Je reste disponible pour toute question. Sunski
-
[NEW Script] Advanced Tools for Mission Editor
sunski34 replied to sunski34's topic in Mission Editor
Hi, today a new version of ATME. This version fixed some problems but the more important is that ATME.C_Polygon class has been implemented. Now, you can create non crossed polygons, add them to areas, test if unit or other references are inside. A polygon can be defined with points (2D ou 3D) or center of DCS zones or mix of them. You can get a random position in the polygon. Of course, isInZone2D function of ATME.C_Group, ATME.C_AIUnit or ATME.C_Player, getGroupsInZone2DForAll or getGroupsInZone2DForCoalition class function of ATME.C_Group class now support polygons. ATME.C_Area class offers new functions like getInsideZones which return zones where a reference as a unit for example is. You can get areas by their name (see example mission and lua file below) or get a zone in an area by its name. English documentation has been updated with a lot of corrections in the reference part (classes and functions descriptions). You can now create ring with a DCS Zone and a delta radius (if negative radius of DCS Zone is external limit, if positive, radius of DCS Zone is internal limit). Enjoy ATME and have fun ;) Sunski ATME_ZoneTest.lua test zone.miz -
Je n'ai rien reçu, je t'envoie un message en privé de mon côté. Nous volons effectivement Samedi vers 15h. Sunski
-
Yes and no... I have de trackball on left hand, I have switches (2 and 3 states), rotary encoder and buttons too.... But I think that binds have to exist. In the first versions of Mig21b that was possible with a little modification of default lua file for joystick. Other switches have their bind so why not ;) Of course not, just one three state switch is enough .... But three commands : -> Two down commands for each state of the switch -> 1 up for the neutral position of the switch Default lua file can be modify if binds exists. The two kind of binding may exit ; all people doesn't want a single push button to activate a 3 state switch... For example, this can be done for flaps, IR/Neutral/SAR switches ! Binds are defined in default lua file.
-
@Henri1a : Oui, nous sommes quelques uns dans ce cas, sans être une escradrille . Pour ma part, les WE en après midi et en semaine si je suis en congés. Si intéressé, me laisser un message privé. War bird et Map Normandy précommandée par certains d'entre nous. Hélicos, map nevada et la plupart des avions. A bientôt Sunski
-
Yes excellent module... Just a little remark ... Why can't we have three joystick binds, one for taxi Light, one for landing light and one for light off. In mig21 it's a three state switch and actually bind is limited to a cycle push button ! Hope that can be done one day Regards
-
[NEW Script] Advanced Tools for Mission Editor
sunski34 replied to sunski34's topic in Mission Editor
New major version V.1.1.0 Hi, today, a new version of ATME V1.1.0. This version has some important changes like : -> Optimizations of ATME.C_F10Menu and some critical modifications (see below) -> Modifications on Zone 2D : now new classes ATME.C_Ring and ATME.C_Circle (and in future version ATME.C_Polygon). All that new classes can be used in "Zone2D" functions (like player:isInZone2D). Old syntax with center and radius, limited to circles, isn't supported anymore. -> Event Core "SPAWN_GROUP" has been removed to prepare new versions. Now a new callback has been create onSpawnGroupCallbackHandler. You can see all news here : https://forums.eagle.ru/showpost.php?p=3001608&postcount=1 Management of F10 menus changes like this : player:getF10MenuRoot() becomes now player:getF10MenuRoot(thisModule) where thisModule is the instance of your module. ATME.C_F10Menu(player, label, parent)to create a submenu in parent menu/submenu. You can optimize when create a submenu in root F10 menu : local menu = player:getF10MenuRoot(thisModule) local subMenu = ATME.C_F10Menu(player, "My submenu", menu) can be written like this : local subMenu = ATME.C_F10Menu(player, "My submenu", thisModule)You can find ATME_module1e example below. I join lua code and mission for spawn Handler too , and below example : local newHandlers = { onCreatePlayerHandler = onCreatePlayer, onDeletePlayerHandler = nil, onUpdatePlayerHandler = onUpdatePlayer, onTakeoffPlayerHandler = nil, onLandingPlayerHandler = nil, onStartEnginePlayerHandler = nil, onStopEnginePlayerHandler = nil, onCreateAIUnitHandler = nil, onDeleteAIUnitHandler = nil, onDisableAIUnitHandler = nil, onTakeoffAIUnitHandler = nil, onLandingAIUnitHandler = nil, onStartEngineAIUnitHandler = nil, onStopEngineAIUnitHandler = onUnitStopEngine, onCreateGroupHandler = nil, [b]onSpawnGroupHandler = onSpawn, [/b] onDeleteGroupHandler = nil, onDisableGroupHandler = nil, onCreateStaticObjectHandler = nil, onDeleteStaticObjectHandler = nil, onTimerHandler = nil, onModuleStartHandler = nil, } and onSpawn function example : local function onSpawn(group) local player = ATME.C_Player.getByName("Pilot #002") player:display("Spawn group ".. group:getName(),5) if group:getName() == "new A10A" then local unit = group:getFirstUnit() while unit ~= nil do local name, id1, id2 = unit:getCallsign() if name ~= nil then if id1 ~= nil then -- Blue coalition player:display("Callsign spawn " .. unit:getName() .. " = " .. name .. " " .. id1 .. "-" .. id2, 5) else -- Red coalition player:display("Callsign spawn " .. unit:getName() .. " = " .. name, 5) end end unit = group:getNextUnit() end end endonSpawnGroupHandler is called after onCreateGroupHandler. So all is initialized, and you can of course change route for example. Note that functions like setRoute need a delay when new DCS group is created. onSpawnGroupHandler is the best way to do that, onCreateGroupHandler not (called too early after DCS group creation so the route change may not work, I will optimise that in future version). ATME_Rescue has been updated too for compatibility. So, do not forgot to modify your code if necessary. If not, you will have ATME errors. Documentation will be updated soon. Enjoy ATME Ask me for any question. Sunski34 test new spawn A10A.miz ATME_spawnA10A basic.lua ATME_module1e.lua ATME_module1e.miz -
Troop transportation embark/disembark/land UH-1 usage?
sunski34 replied to WildBillKelsoe's topic in Mission Editor
May be a solution here embark/disembark ... https://forums.eagle.ru/showpost.php?p=3058448&postcount=10 Ask me if you need help. Sunski -
Late activation units, stay active in the background?
sunski34 replied to Knock-Knock's topic in Mission Editor
There's no real solution I think actually. If you spawn, you can have little DCS freeze sometimes. If you have late activation groups, no freeze when activate. Sunski -
Late activation units, stay active in the background?
sunski34 replied to Knock-Knock's topic in Mission Editor
Hi, I found in my experience (developping a lua Framework), that late activate groups are created immediatly when mission starts because DCS send a lua DCS event BIRTH. They seem to be invisible (this for grounds units) but present and of course freezed. For example, other ground units turn around a late activation group. When you desactivate, unit (or group) is destroyed from the mission, DCS send a lua event DEAD. So it may have an impact even if this might be light. -
Yes, spawn returns err and name of the new group if err == false. But be careful : The group may not exist at this time, DCS can take time to create it. The best way is to use ATME core event "GROUP_SPAWN", so you can catch it in your function onZonePass like other core event, but in that case new spawn group will be in datas.group variable. if typeEvent == "AREA_AIRCRAFT_ENTERS" then local datas = events:getCoreEventDatas(_id) -- player is in datas.unit variable -- area is in datas.area variable .... elseif typeEvent == "GROUP_SPAWN" then local datas = events:getCoreEventDatas(_id) local newSpawnedGroup = datas.group .... end Units of the group have been remaned too, you can find it in french documentation p171 : "SpawnUXXXXX-" follows by its original name. XXXXX is a number. So in a group, for its units, you just have to find "-" with string.find lua function then take the sub string from this position + 1 (position is position or "-" in the string) to the end of the string and compare with original name. You can of course, list all units of a group with group:getFirstUnit(), group:getNextUnit() until nil, and for each unit, get its name : local unit = group:getFirstUnit() while unit ~= nil do local name = unit:getName() local d,f = string.find(name, "-") local originalName = string.sub(name, f + 1, name:len()) unit = group:getNextUnit() end Sunski
-
hi ked, local err, var1 = ATME.C_GroupSpawnDatas.duplicateFromMissionDatas(......) if err == false then var1 is an ATME.GroupSpawnDatas instance which represents units in mission datas you want to spawn. spawn is a function of that class too. if err == true then var1 is error code you can find that in documentation. of course you can change its name. But you can't assign variables modules[xxxx] to that object. You can do that just for ATME.C_Group , ATME.C_Player or ATME.C_AIUnits. That's all classes wich accept such variables. Normally those variables are created to pass values between modules, or to Mission Editor trigger using scripts directly (example: a new function you created).
-
it has to work with for _i = 1, #ATME.modules[moduleName].areas do too it's the same #ATME.modules[moduleName].areas = 8
-
If you want help on ATME script, do not hesitate here is a video : you will see abilities on embark/disembark at 1:56s Sunski
-
In my loop modulesName is bad, it's moduleName, moduleName is a global variable : so for _i = 1, #ATME.modules[modulesName].areas do and forward must be modified with moduleName (no s between module and Name) ; for _i = 1, #ATME.modules[moduleName].areas do Then that works. modulesName is not a defined variable so, that's why the loop didn't work. It's a lua problem, so be careful with that. onTimer is a function callback by a timer so no error in that case too. I modified my answer : https://forums.eagle.ru/showpost.php?p=3074739&postcount=13 Hope that helps Sunski
-
Yes, documentation is not complete for spawn function : var1:spawn("Bravo 1") In that case spawn a group somewhere in DCS zone 'Bravo 1' var1:spawn(area) If area is an instance of ATME.C_Area then spawn somewhere in the area (even if area has several zones defined). So you can spawn at a point, somewhere in a DCSZone or somewhere in a defined area. For your second problem with loop, strange, can you send me your mission and lua file. Did you try display outside the loop ? You have to see message when player enters area (just enters not in area, state change)
-
That doesn't work good actually. and there's a bug report on that. So, I think you have to use a script if you want to do embark/disembark. CTLD or ATME will be good depending of what you want to do. ATME has a dynamic troops boarding. CTLD has other abilities.
-
I see another problem with : var1:spawn(ATME.modules[modulesName].areas[i].spawn) That isn't good. Replace with : var1:spawn(ATME.modules[modulesName].areas[i].area) if you want to spawn anywhere in the area (random in all DCSZones defined in an area) except if you want to spawn in DCSZone called ATME.modules[modulesName].areas.spawn, that's isn't the same ! More information : If you don't need to know really the area, you can delete the loop and use directly datas.area like this : var1:spawn(datas.area) see here : https://forums.eagle.ru/showpost.php?p=3073466&postcount=11 in that thread
-
Hi, I see ... You have to initialize your module variables (areas) before creating player. As I said, init function (linked with onStartHandler) will be called twice, once before players initialized (for player in cockpit at start of mission, at least one) and once after. So, you have to change : if areUnitsAndPlayersInitialized == true then in if areUnitsAndPlayersInitialized == false then then your variables will be initialized before onCreatePlayer will be called. To understand, let me explain a little bit how that works in lua: When starting a mission, there's two possibilities with players : Players who are already in mission when ATME starts. So in that case, onCreatePlayerHandler will be called during the start of ATME Players who will enter DCS later, so of course, nothing is done when ATME starts. But, onStartHandler may help you to prepare some necessary code (depending of what you want to do) and in that case two possibilities : If what you do in your code is necessary for all players and units (example specific variables), and will be used in onCreate...Handler (AIUnit, Player or Groups), you have to set them before players and AI units initializations so onStartHandler areUnitsAndPlayersInitialized parameter will be test to false. If what you do in your code is not necessary for onCreate...Handler or need players and AI Units to be initialized, then, no problem, onStartHandler areUnitsAndPlayersInitialized parameter will be test to true. Of course you can do a mix.
-
Hi ked, Your onZonePass function callback have to be changed to an onTimerHandler, no needs to use onUpdatePlayerHandler in that case because event core for areas have player (or AI unit) instance in their datas. So : -- MAIN do local newHandlers = { onCreatePlayerHandler = onCreatePlayer, onDeletePlayerHandler = nil, onUpdatePlayerHandler = nil, onTakeoffPlayerHandler = nil, onLandingPlayerHandler = nil, onStartEnginePlayerHandler = nil, onStopEnginePlayerHandler = nil, onCreateAIUnitHandler = nil, onDeleteAIUnitHandler = nil, onDisableAIUnitHandler = nil, onTakeoffAIUnitHandler = nil, onLandingAIUnitHandler = nil, onStartEngineAIUnitHandler = nil, onStopEngineAIUnitHandler = nil, onCreateGroupHandler = nil, onDeleteGroupHandler = nil, onDisableGroupHandler = nil, onCreateStaticObjectHandler = nil, onDeleteStaticObjectHandler = nil, onTimerHandler = onZonePass, onModuleStartHandler = init, } thisModule = ATME.C_Module(moduleName, newHandlers, true) end You have an example of using events for entering and leaving areas here : https://forums.eagle.ru/showpost.php?p=3069903&postcount=55 You just have to change setAircraftsGroupTracking by setAircraftTracking as explained above. For your areas I suggest you to put them in a table in onStartHandler but do not forgot the parameter. This callback is called twice when ATME starts : Once before units and players initialized, in that case parameter will be false, Once after, parameter is true. So if you don't use the parameter, your code will be executed twice. So : local function init(areUnitsAndPlayersInitialized) -- Do not forgot parameter onStartHandler if areUnitsAndPlayersInitialized == true then --players and units mission datas are initialized ATME.modules[moduleName].areas = {} ATME.modules[moduleName].areas[1] = { area = ATME.C_Area(), name = "Bravo", } ATME.modules[moduleName].areas[1].area:add("Bravo 1") ... ATME.modules[moduleName].areas[2] = { area = ATME.C_Area(), name = "Charlie", } ATME.modules[moduleName].areas[2].area:add("Charlie 1") ... ... end end in onCreatePlayer callback function, add : -- Link player and areas ATME.modules[moduleName].areas[1].area:setAircraftTracking(player) ATME.modules[moduleName].areas[2].area:setAircraftTracking(player) ... -- for all your areas then in onZonePass add code below (now only one parameter because onTimerHandler). To find the good area then do a loop. So, finally : local function onZonePass(events) for _id, _ in events:pairs() do if events:isCoreEvent(_id) == true then local typeEvent = events:getCoreEventType(_id) if typeEvent == "AREA_AIRCRAFT_ENTERS" then local datas = events:getCoreEventDatas(_id) -- player is in datas.unit variable -- area is in datas.area variable local player = datas.unit -- loop on your areas here when player enters a zone for _i = 1, #ATME.modules[moduleName].areas do if ATME.modules[moduleName].areas[i].area == datas.area then if ATME.modules[moduleName].areas[i].name == "Bravo" then -- Code when player enters Bravo Area elseif .... -- Test other area names and add specific code end end end elseif typeEvent == "AREA_AIRCRAFT_LEAVES" then local datas = events:getCoreEventDatas(_id) -- player is in datas.unit variable -- area is in datas.area variable local player = datas.unit -- loop on your areas here when player leaves a zone for _i = 1, #ATME.modules[moduleName].areas do if ATME.modules[moduleName].areas[i].area == datas.area then if ATME.modules[moduleName].areas[i].name == "Bravo" then -- Code when player leaves Bravo Area elseif .... -- Test other area names and add specific code end end end end end end end events parameter of onTimer callback function (or onZonePass in your case) contains all core events and user trigger events which has been fired by ATME since last timer trigger. It's a particular table. Of course, if player (or AI unit or group) has been killed or desactivated since the last call, the core event isn't in the table anymore ; in that case, core event has been delete. All core events have a player, an AI unit or a group in theirs datas depending of their type. If unit (player or AI unit), you may test if unit is ATME.C_Player or ATME.C_AIUnit in your code if necessary, in your case all units are players, so no test. Note that instances of ATME.C_Area class will have their own name in next version to find directly an area by its name, so, that will be easier soon. Of course, in documentation, you will find functions using core events and ATME.C_Area class. And you can find French doc p54, English doc p51, the Module 4 which explains how to use Core events. My answer is just a example of a particular Core event Sunski.
-
Concerning polygons, yes ATME doesn't support it actually. The problem is spawning surely a group inside a complex polygon. ATME can work with MIST but with MOOSE I don't know. I understood in Mist lua code that Mist tries random several times and test if point is inside a polygon. I know it's possible to be sure that random point will be in complex polygon but code isn't easy and needs a lot of tests. Concerning lags, when you spawn groups you can have lags, not at each time but sometimes. There's no link between lags and menus. So lags is not an ATME problem (if you only have 3 players), but I'm interesting to have your DCS log file to be sure. Of course having more ram is better. Concerning your code : ATME has ATME.C_Area class which can help you to simplify your code. You can create several areas, each area can include several DCS zones. link here https://forums.eagle.ru/showpost.php?p=3039210&postcount=42 So for example : if (player:isInDCSZone("Bravo 1") == true or player:isInDCSZone("Bravo 2") == true or player:isInDCSZone("Bravo 3") == true or player:isInDCSZone("Bravo 4") == true or player:isInDCSZone("Bravo 5") == true or player:isInDCSZone("Bravo 6") == true) and player.modules[moduleName].coalitionName == "BLUE" then can be replace by : local bravoArea = ATME.C_Area() bravoArea:add("Bravo 1") bravoArea:add("Bravo 2") bravoArea:add("Bravo 3") bravoArea:add("Bravo 4") bravoArea:add("Bravo 5") bravoArea:add("Bravo 6") if player:isInArea(bravoArea) == true and player.modules[moduleName].coalitionName == "BLUE" then bravoArea can be a player, global or local variable of course. Another possibility is to link player (or player group) and area , link here :https://forums.eagle.ru/showpost.php?p=3069903&postcount=55 This can be done in onCreatePlayer function for example : local bravoArea = ATME.C_Area() bravoArea:add("Bravo 1") bravoArea:add("Bravo 2") bravoArea:add("Bravo 3") bravoArea:add("Bravo 4") bravoArea:add("Bravo 5") bravoArea:add("Bravo 6") -- Link player and area bravoArea:setAircraftTracking(player) and in your function onZonePass just use events parameter : for _id, _ in events:pairs() do if events:isCoreEvent(_id) == true then local typeEvent = events:getCoreEventType(_id) if typeEvent == "AREA_AIRCRAFT_ENTERS" then local datas = events:getCoreEventDatas(_id) -- player is in datas.unit variable -- area is in datas.area variable local player = datas.unit player:display("Player " .. player:getPseudo() .. " in Bravo zone", 5) elseif typeEvent == "AREA_AIRCRAFT_LEAVES" then local datas = events:getCoreEventDatas(_id) -- player is in datas.unit variable -- area is in datas.area variable local player = datas.unit player:display("Player " .. player:getPseudo() .. " leaves Bravo zone", 5) end end end I didn't test that code above but I think it works if I didn't make stupid mistake ;) So you have several possibilies to simplify your code using ATME.C_Area class, even if you want to spawn in a area you can use : datas:spawn(bravoArea) So ATME.C_Area class is not completly finished but I'm sure it's the best way to do what you want. Hope that help ! Sunski
-
[NEW Script] Advanced Tools for Mission Editor
sunski34 replied to sunski34's topic in Mission Editor
Hi, today, english documentation as been updated to V1.0.11. see here :https://forums.eagle.ru/showpost.php?p=3001613&postcount=2 Enjoy ATME Sunski -
Hi, actually, ATME doesn't change tasks defined in Mission Editor. You cannot assign new tasks with ATME too (except indirect task full managed by ATME like waypoint tracking or managing boarding/unboarding units). Those abilities are in the roadmap for the future (no release date). My priority is to stabilize actual lua code, finalise basics abilities and leave beta version. If you want to assign or modify specific tasks, you have to define or modify them in Mission Editor only (like explained above). When you spawn a group with ATME, you can assign route of another group. So in ME you can create desactivated group with route correctly defined (with good tasks) and assign this route to another group. Hope that help Sunski
-
Bonjour, ce jour un correctif V1.0.11 pour un bug quand un aéronef décolle d'un porte-avions ou d'un bateau avec un hélipad. Pas d'autre changement. Sunski