cfrag Posted October 9, 2021 Posted October 9, 2021 (edited) UPDATE: Small bug fix for issue with deactivated carriers (20230324) WHAT IT IS: I've lately been developing some MP missions that have a heavy focus on capturing airfields, and with gaining access to airfields should come the ability to gain access to additional air frames and locations ("slots") for players to spawn. So when your side captures an airfield, player slots on that airfield become available, while slots for players from the other faction close down. This script accomplishes that. To add this ability to your own missions, do this: Step one is @Ciribob's fantastic simple slot blocker (a.k.a. "SSB"). That script covers the server side, and does most of the heavy lifting (this means that currently, SSB only works if you run your mission as multiplayer). SSB's biggest drawback is that it's not that easy to use for mission designers. Since I was at it anyway, I wrote a light-weight client-side counterpart to SSB, and creatively named it "cfxSSBClient". It automatcally blocks player slots if the airfield does not belong to the correct side (or is - optionally - neutral). If you place blue player aircraft on red airfields in ME (and vice versa), they now only become available when the airfield belongs to the corresponding side (MP only). Below please find the script for your own missions. PLEASE NOTE A more capable, expanded version is part of DML THIS IS HOW IT WORKS Any player group that you wish to be blocked from spawning until the airfield belongs to the correct side must have the group's first player unit placed on the ground (i.e. "Take off" with one the following: "From Runway", "From Parking Area", "From Parking Area Hot", "From Ground Area", "From Ground Area Hot") within 3000m of the airfield's/FARP's center. That is all. There are some additional options available for those who want to be - to quote Gollum - tricksy with their missions, but you can safely skip the next section and SSBClient will work as described above. OPTIONAL ADDITIONAL FEATURES (ONLY REQUIRED IF YOU DEMAND MORE FUN) The client now supports methods to "close" and "open" airfields, and the ability to "bind" (and "unbind") aircraft to airfields. Using these methods is not required. They can be invoked either through your Lua scripts, or with a DOSCRIPT action in ME Closing an airfield A closed airfield will not permit any player groups that start from there to be entered (slots are blocked), no matter who the airfield belongs to. This is commonly used to close FARPS that are still hidden, or to close contested airfields. To close an airfield, invoke cfxSSBClient.closeAirfieldNamed(name) with name being the name of the airfield or FARP. Exact match is required. No error if no matching airfield is found. Opening an airfield You only need to open an airfield if it was previously closed, meaning that initially, all airfields are open. To open an airfield, invoke cfxSSBClient.openAirFieldNamed(name) with name being the name of the airfield or FARP. Exact match is required. No error if no matching airfield is found, or the airfield was open already Unbinding a group Due to the way that airfields are matched to groups, in rare cases it may become desirable to allow a player group to spawn in an enemy controlled airfield, FARP or even ship (or ground-start close to it). Usually, SSBClient will prevent you from doing so, because it sees the closest airfield as enemy controlled. You can 'unbind' the group from any airfield, making it always available to start, no matter who owns the closest airfield. To do this, invoke cfxSSBClient.unbindGroup(groupName) You now can enter the plane at any time (slot blocking is essentially turned off for this group) Binding a group to an airfield You can bind groups to other airfields (i.e. different to those that SSB binds them to during start-up). Note that this does not move the aircraft to the newly bound airfield. It merely binds the availability of that group to the ownership of the newly bound airfield. Use this for special effects like allowing aircraft to become available on airfield B depending on the ownership of airfield A (by binding the group located at B to airfield A). To bind a group to a different airfield, invoke cfxSSBC cfxSSBClient.bindGroupToAirfield(groupName, airfieldName) with groupName and airfieldName both requiring an exact match to the group name and airfield name. Binding in-air starts You can use above bind feature to bind in-air starts to airfields (usually, in-air starts are ignored by SSBClient). This requires that you ensure that cfxSSBClient.keepInAirGroups is set to true. Notes this script works with all maps, not just beautiful Caucasus this script works with FARPS as well (that was why it was written in the first place ) this script should work with ships as well. Since ships can't be captured this is only relevant if the ship in question sinks, is removed, or not spawned. More testing required. [Update in early 2023: indeed, a potential bug was identified with deactivated carriers. Corrected] groups that spawn in the air aren't affected, even if overflying an enemy airfield does not affect non-player flights ONLY WORKS IN MP SERVER MODE, CAN'T BE TESTED IN ME (bummer, can't be helped) SERVER MUST BE UNPAUSED HOW TO USE (SERVER ONLY) - Install Ciribob's simple slot block script in the Hooks folder Copy the entire script (see below) into a DO SCRIP action that runs at MISSION START there is no step 3 Here's the script to copy paste. Spoiler cfxGroups = {} cfxGroups.version = "1.1.0" --[[-- Module to read Unit data from DCS and make it available to scripts DOES NOT KEEP TRACK OF MISSION-CREATED GROUPS!!!! Main use is to access player groups for slot blocking etc since these groups can't be allocated dynamically Version history 1.0.0 - initial version 1.1.0 - for each player unit, store point(x, 0, y), and action for first WP, as well as name --]]-- cfxGroups.groups = {} -- all groups, indexed by name --[[-- group objects are { name= "", coalition = "" (red, bleu, neutral), coanum = # (0, 1, 2 for neutral, red, blue) category = "" (helicopter, ship, plane, vehicle, static), hasPlayer = true/false, playerUnits = {} (for each player unit in group: name, point, action) } --]]-- function cfxGroups.fetchAllGroupsFromDCS() -- a mission is a lua table that is loaded by executing the miz. it builds -- the environment mission table, accesible as env.mission -- iterate the "coalition" table of the mission (note: NOT coalitionS) -- inspired by mist, GIANT tip o'the hat to Grimes! for coa_name_miz, coa_data in pairs(env.mission.coalition) do -- iterate all coalitions local coa_name = coa_name_miz if string.lower(coa_name_miz) == 'neutrals' then -- convert "neutrals" to "neutral", singular coa_name = 'neutral' end -- directly convert coalition into number for easier access later local coaNum = 0 if coa_name == "red" then coaNum = 1 end if coa_name == "blue" then coaNum = 2 end if type(coa_data) == 'table' then if coa_data.country then -- make sure there a country table for this coalition for cntry_id, cntry_data in pairs(coa_data.country) do -- iterate all countries for this local countryName = string.lower(cntry_data.name) if type(cntry_data) == 'table' then --just making sure for obj_type_name, obj_type_data in pairs(cntry_data) do if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check local category = obj_type_name if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! for group_num, group_data in pairs(obj_type_data.group) do if group_data and group_data.units and type(group_data.units) == 'table' then --making sure again- this is a valid group local groupName = group_data.name if env.mission.version > 7 then -- translate raw to actual groupName = env.getValueDictByKey(groupName) end local hasPlayer = false local playerUnits = {} for unit_num, unit_data in pairs(group_data.units) do -- iterate units -- see if there is at least one player in group if unit_data.skill then if unit_data.skill == "Client" or unit_data.skill == "Player" then -- this is player unit. save it, remember hasPlayer = true local playerData = {} playerData.name = unit_data.name playerData.point = {} playerData.point.x = unit_data.x playerData.point.y = 0 playerData.point.z = unit_data.y playerData.action = "none" -- default -- access initial waypoint data by 'reaching up' -- into group data and extract route.points[1] if group_data.route and group_data.route.points and (#group_data.route.points > 0) then playerData.action = group_data.route.points[1].action end table.insert(playerUnits, playerData) end end end --for all units in group local entry = {} entry.name = groupName entry.coalition = coa_name entry.coaNum = coaNum entry.category = category entry.hasPlayer = hasPlayer entry.playerUnits = playerUnits -- add to db cfxGroups.groups[groupName] = entry end --if has group_data and group_data.units then end --for all groups in category end --if has category data end --if plane, helo etc... category end --for all objects in country end --if has country data end --for all countries in coalition end --if coalition has country table end -- if there is coalition data end --for all coalitions in mission end -- simply dump all groups to the screen function cfxGroups.showAllGroups() for gName, gData in pairs (cfxGroups.groups) do local isP = "(NPC)" if gData.hasPlayer then isP = "*PLAYER GROUP (".. #gData.playerUnits ..")*" end trigger.action.outText(gData.name.. ": " .. isP .. " - " .. gData.category .. ", F:" .. gData.coalition .. " (" .. gData.coaNum .. ")", 30) end end -- return all cfxGroups that can have players in them -- includes groups that currently are not or not anymore alive function cfxGroups.getPlayerGroup() local playerGroups = {} for gName, gData in pairs (cfxGroups.groups) do if gData.hasPlayer then table.insert(playerGroups, gData) end end return playerGroups end -- return all group names that can have players in them -- includes groups that currently are not or not anymore alive function cfxGroups.getPlayerGroupNames() local playerGroups = {} for gName, gData in pairs (cfxGroups.groups) do if gData.hasPlayer then table.insert(playerGroups, gName) end end return playerGroups end function cfxGroups.start() cfxGroups.fetchAllGroupsFromDCS() -- read all groups from mission. -- cfxGroups.showAllGroups() trigger.action.outText("cfxGroups version " .. cfxGroups.version .. " started", 30) return true end cfxGroups.start() cfxSSBClient = {} cfxSSBClient.version = "1.2.1" cfxSSBClient.verbose = false --[[-- Version History 1.0.0 - initial version 1.1.0 - detect airfield by action and location, not group name 1.1.1 - performance tuning. only read player groups once - and remove in-air-start groups from scan. this requires - ssb (server) be not modified 1.2.0 - API to close airfields: invoke openAirfieldNamed() and closeAirfieldNamed() with name as string (exact match required) to block an airfield for any player aircraft. Works for FARPS as well API to associate a player group with any airfied's status (nil for unbind): cfxSSBClient.bindGroupToAirfield(group, airfieldName) API shortcut to unbind groups: cfxSSBClient.unbindGroup(group) verbose messages now identify better: "+++SSB:" 1.2.1 - can handle late activating air fields (carriers) WHAT IT IS SSB Client is a small script that forms the client-side counterpart to Ciribob's simple slot block. It will block slots for all client airframes that are on an airfield that does not belong to the faction that currently owns the airfield. REQUIRES CIRIBOB's SIMPLE SLOT BLOCK (SSB) TO RUN ON THE SERVER If run without SSB, your planes will not be blocked. In order to work, a plane that should be blocked when the airfield or FARP doesn't belong to the player's faction, the group's first unit must be within 3000 meters of the airfield and on the ground. Previous versions of this script relied on group names. No longer. WARNING: If you modified ssb's flag values, this script will not work YOU DO NOT NEED TO ACTIVATE SBB, THIS SCRIPT DOES SO AUTOMAGICALLY --]]-- -- below value for enabled MUST BE THE SAME AS THE VALUE OF THE SAME NAME -- IN SSB. DEFAULT IS ZERO, AND THIS WILL WORK cfxSSBClient.enabledFlagValue = 0 -- DO NOT CHANGE, MUST MATCH SSB cfxSSBClient.disabledFlagValue = cfxSSBClient.enabledFlagValue + 100 -- DO NOT CHANGE cfxSSBClient.allowNeutralFields = false -- set to FALSE if players can't spawn on neutral airfields cfxSSBClient.maxAirfieldRange = 3000 -- meters to airfield before group is no longer associated with airfield -- actions to home in on when a player plane is detected and a slot may -- be blocked. Currently, homing in on airfield, but not fly over cfxSSBClient.slotActions = { "From Runway", "From Parking Area", "From Parking Area Hot", "From Ground Area", "From Ground Area Hot", } cfxSSBClient.keepInAirGroups = true -- if false we only look at planes starting on the ground -- setting this to true only makes sense if you plan to bind in-air starts to airfields cfxSSBClient.playerGroups = {} cfxSSBClient.closedAirfields = {} -- list that closes airfields for any aircrafts function cfxSSBClient.closeAirfieldNamed(name) if not name then return end cfxSSBClient.closedAirfields[name] = true cfxSSBClient.setSlotAccessByAirfieldOwner() if cfxSSBClient.verbose then trigger.action.outText("+++SSB: Airfield " .. name .. " now closed", 30) end end function cfxSSBClient.openAirFieldNamed(name) cfxSSBClient.closedAirfields[name] = nil cfxSSBClient.setSlotAccessByAirfieldOwner() if cfxSSBClient.verbose then trigger.action.outText("+++SSB: Airfield " .. name .. " just opened", 30) end end function cfxSSBClient.unbindGroup(groupName) cfxSSBClient.bindGroupToAirfield(groupName, nil) end function cfxSSBClient.bindGroupToAirfield(groupName, airfieldName) if not groupName then return end local airfield = nil if airfieldName then airfield = Airbase.getByName(airfieldName) end for idx, theGroup in pairs(cfxSSBClient.playerGroups) do if theGroup.name == groupName then if cfxSSBClient.verbose then local newBind = "NIL" if airfield then newBind = airfieldName end trigger.action.outText("+++SSB: Group " .. theGroup.name .. " changed binding to " .. newBind, 30) end theGroup.airfield = airfield return end end if not airfieldName then airfieldName = "<NIL>" end trigger.action.outText("+++SSB: Binding Group " .. groupName .. " to " .. airfieldName .. " failed.", 30) end function cfxSSBClient.dist(point1, point2) -- returns distance between two points local x = point1.x - point2.x local y = point1.y - point2.y local z = point1.z - point2.z return (x*x + y*y + z*z)^0.5 end -- see if instring conatins what, defaults to case insensitive function cfxSSBClient.containsString(inString, what, caseSensitive) if (not caseSensitive) then inString = string.upper(inString) what = string.upper(what) end return string.find(inString, what) end function cfxSSBClient.arrayContainsString(theArray, theString) -- warning: case sensitive! if not theArray then return false end if not theString then return false end for i = 1, #theArray do if theArray[i] == theString then return true end end return false end function cfxSSBClient.getClosestAirbaseTo(thePoint) local delta = math.huge local allYourBase = world.getAirbases() -- get em all local closestBase = nil for idx, aBase in pairs(allYourBase) do -- iterate them all local abPoint = aBase:getPoint() newDelta = cfxSSBClient.dist(thePoint, {x=abPoint.x, y = 0, z=abPoint.z}) if newDelta < delta then delta = newDelta closestBase = aBase end end return closestBase, delta end function cfxSSBClient.setSlotAccessByAirfieldOwner() -- get all groups that have a player-controlled aircraft -- now uses cached, reduced set of player planes local pGroups = cfxSSBClient.playerGroups -- cfxGroups.getPlayerGroup() -- we want the group.name attribute for idx, theGroup in pairs(pGroups) do local theName = theGroup.name -- airfield was attached at startup to group local theMatchingAirfield = theGroup.airfield -- make sure airfield exists (if late activated) if theMatchingAirfield ~= nil then -- we have found a plane that is tied to an airfield -- so this group will receive a block/unblock -- we always set all block/unblock every time -- the airfield may not exist right now. in this case, -- block the slot local comment = "pass" local blockState = cfxSSBClient.enabledFlagValue -- we default to ALLOW the block if not Object.isExist(theMatchingAirfield) then -- airfield does not exits yet/any more blockState = cfxSSBClient.disabledFlagValue comment = "!inactive airfield!" else local airFieldSide = theMatchingAirfield:getCoalition() local groupCoalition = theGroup.coaNum -- see if airfield is closed local afName = theMatchingAirfield:getName() if cfxSSBClient.closedAirfields[afName] then -- airfield is closed. no take-offs blockState = cfxSSBClient.disabledFlagValue comment = "!closed airfield!" end -- on top of that, check coalitions if groupCoalition ~= airFieldSide then -- we have a problem. sides don't match if airFieldSide == 3 or (cfxSSBClient.allowNeutralFields and airFieldSide == 0) then -- all is well, airfield is contested or neutral and -- we allow this plane to spawn here else -- DISALLOWED!!!! blockState = cfxSSBClient.disabledFlagValue comment = "!!!BLOCKED!!!" end end end -- set the ssb flag for this group so the server can see it trigger.action.setUserFlag(theName, blockState) if cfxSSBClient.verbose then trigger.action.outText("+++SSB: group ".. theName .. ": " .. comment, 30) end else if cfxSSBClient.verbose then trigger.action.outText("+++SSB: group ".. theName .. " no bound airfield", 30) end end end end function cfxSSBClient:onEvent(event) if event.id == 10 then -- S_EVENT_BASE_CAPTURED if cfxSSBClient.verbose then trigger.action.outText("+++SSB: CAPTURE EVENT -- RESETTING SLOTS", 30) end cfxSSBClient.setSlotAccessByAirfieldOwner() end -- removed parachute guy filter. use parashoo instead end function cfxSSBClient.update() -- first, re-schedule me in one minute timer.scheduleFunction(cfxSSBClient.update, {}, timer.getTime() + 60) -- now establish all slot blocks cfxSSBClient.setSlotAccessByAirfieldOwner() end -- pre-process static player data to minimize -- processor load on checks function cfxSSBClient.processPlayerData() cfxSSBClient.playerGroups = cfxGroups.getPlayerGroup() local pGroups = cfxSSBClient.playerGroups local filteredPlayers = {} for idx, theGroup in pairs(pGroups) do if theGroup.airfield ~= nil or cfxSSBClient.keepInAirGroups then -- only transfer groups that have airfields (or also keepInAirGroups) -- attached. Ignore the rest as they are -- always fine table.insert(filteredPlayers, theGroup) end end cfxSSBClient.playerGroups = filteredPlayers end -- add airfield information to each player group function cfxSSBClient.processGroupData() local pGroups = cfxGroups.getPlayerGroup() -- we want the group.name attribute for idx, theGroup in pairs(pGroups) do -- we always use the first player's plane as referenced local playerData = theGroup.playerUnits[1] local theAirfield = nil local delta = -1 local action = playerData.action if not action then action = "<NIL>" end -- see if the data has any of the slot-interesting actions if cfxSSBClient.arrayContainsString(cfxSSBClient.slotActions, action ) then -- yes, fetch the closest airfield theAirfield, delta = cfxSSBClient.getClosestAirbaseTo(playerData.point) local afName = theAirfield:getName() if cfxSSBClient.verbose then trigger.action.outText("+++SSB: group: " .. theGroup.name .. " closest to AF " .. afName .. ": " .. delta .. "m" , 30) end if delta > cfxSSBClient.maxAirfieldRange then -- forget airfield theAirfield = nil end theGroup.airfield = theAirfield else if cfxSSBClient.verbose then trigger.action.outText("+++SSB: group: " .. theGroup.name .. " action " .. action .. " does not concern SSB", 30) end end end end function cfxSSBClient.start() -- install callback for events in DCS world.addEventHandler(cfxSSBClient) -- process group data to attach airfields cfxSSBClient.processGroupData() -- process player data to minimize effort and build cache -- into cfxSSBClient.playerGroups cfxSSBClient.processPlayerData() -- install a timed update just to make sure -- and start NOW timer.scheduleFunction(cfxSSBClient.update, {}, timer.getTime() + 1) -- now turn on ssb trigger.action.setUserFlag("SSB",100) -- say hi! trigger.action.outText("cfxSSBClient v".. cfxSSBClient.version .. " running, SBB enabled", 30) --cfxSSBClient.allYourBase() return true end cfxSSBClient.start() Attached is also a small (updated - 2021-10-10) demo miz that demonstrates it's use (note that in the miz, I separated out the two tables into two separate DOSCRIPTS as that's easier for me to debug - you got that mission straight from the code dungeon). The blue Huey in Batumi becomes available after 60 seconds, when the blue APC enters Batumi's resource zone and captures it. Similarly, blue Huey on red FARP "FARP Conquer Me" only becomes available once the APC captures the FARP south of Senaki (some 120 seconds after start). The Red Hornet can't be used at all (you'll be kicked after the first second in-cockpit if you occupy it at mission start) as Senaki stays blue all the time. The red A-10 above Senaki won't ever be blocked even if Senaki is blue because it's not on the ground. Please put suggestions, comments, bug reports etc. in this thread below. cfxSSBClientTester.miz ssbClient standalone 121.lua Edited June 22, 2023 by cfrag
cfrag Posted October 10, 2021 Author Posted October 10, 2021 (edited) OK, I didn't think it through. Yesterday evening, over a good bottle of wine, I mentioned to my friend how I resolved the slot blocking issue using an ingenious naming scheme that associates an airfield with a group. "How lazy", she commented. I should have known. So this morning I went over the code, righted what I knew was wrong all along. The script now associates a player's slot correctly to an airfield by position, and no longer requires you to mess with names. Simply drop the script, everything works, period. Edited November 13, 2021 by cfrag
phrogZ Posted October 30, 2021 Posted October 30, 2021 Hello cfrag, many thx for this 'client'. It works nicely at the moment
cfrag Posted November 5, 2021 Author Posted November 5, 2021 (edited) Hi all, I applied some (unnecessary, but it still bothered me) performance tuning to the script. Slot pre-processing is now done once, during start, and in-air slots are now always excluded from processing. Edited November 5, 2021 by cfrag
cfrag Posted November 13, 2021 Author Posted November 13, 2021 Hey all, and thank you for your feedback. I have updated SSBClient to add some functionality that was kindly suggested. Note that this added functionality requires using a DOSCIPT action or direct invocation through your Lua scripts. OPTIONAL ADDITIONAL FEATURES (ONLY REQUIRED IF YOU DEMAND MORE FUN) The client now supports methods to "close" and "open" airfields, and the ability to "bind" (and "unbind") aircraft to airfields. Using these methods is not required. They can be invoked either through your Lua scripts, or with a DOSCRIPT action in ME Closing an airfield A closed airfield will not permit any player groups that start from there to be entered (slots are blocked), no matter who the airfield belongs to. This is commonly used to close FARPS that are still hidden, or to close contested airfields. To close an airfield, invoke cfxSSBClient.closeAirfieldNamed(name) with name being the name of the airfield or FARP. Exact match is required. No error if no matching airfield is found. Opening an airfield You only need to open an airfield if it was previously closed, meaning that initially, all airfields are open. To open an airfield, invoke cfxSSBClient.openAirFieldNamed(name) with name being the name of the airfield or FARP. Exact match is required. No error if no matching airfield is found, or the airfield was open already Unbinding a group Due to the way that airfields are matched to groups, in rare cases it may become desirable to allow a player group to spawn in an enemy controlled airfield, FARP or even ship (or ground-start close to it). Usually, SSBClient will prevent you from doing so, because it sees the closest airfield as enemy controlled. You can 'unbind' the group from any airfield, making it always available to start, no matter who owns the closest airfield. To do this, invoke cfxSSBClient.unbindGroup(groupName) You now can enter the plane at any time (slot blocking is essentially turned off for this group) Binding a group to an airfield You can bind groups to other airfields (i.e. different to those that SSB binds them to during start-up). Note that this does not move the aircraft to the newly bound airfield. It merely binds the availability of that group to the ownership of the newly bound airfield. Use this for special effects like allowing aircraft to become available on airfield B depending on the ownership of airfield A (by binding the group located at B to airfield A). To bind a group to a different airfield, invoke cfxSSBC cfxSSBClient.bindGroupToAirfield(groupName, airfieldName) with groupName and airfieldName both requiring an exact match to the group name and airfield name. Binding in-air starts You can use above bind feature to bind in-air starts to airfields (usually, in-air starts are ignored by SSBClient). This requires that you ensure that cfxSSBClient.keepInAirGroups is set to true. 1
TA_Findo Posted March 13, 2022 Posted March 13, 2022 hello, is it possible to delete the recurring messages that appear on the right of the type +++SSB:group xxx-xxx:pass or !!! blocked , I managed to put them at 0 seconds but to remove them completely, I don't know if I try to comment trigger.action.outText it crashes the script thank you in advance
cfrag Posted March 13, 2022 Author Posted March 13, 2022 uh, looks as if I may have overlooked removing these messages, they should only appear if you turned on verbose. I'll make sure they are gone with the next code drop (scheduled for Thursday). So yes, that's very possible and even likely to happen 3 minutes ago, TA_Findo said: is it possible to delete the recurring messages that appear on the right of the type +++SSB:group xxx-xxx:pass or !!! blocked
TA_Findo Posted March 13, 2022 Posted March 13, 2022 oh fantastic, I had missed that in the conversation, it's great, thank you very much , super script really
cfrag Posted March 13, 2022 Author Posted March 13, 2022 1 hour ago, TA_Findo said: to remove them completely Silly question - have you tried to simply turn verbose off? Simply change this line cfxSSBClient.verbose = true to cfxSSBClient.verbose = false That should get rid of all those comments
TA_Findo Posted March 19, 2022 Posted March 19, 2022 (edited) Hello CFRAG, I have this error message that appears on the server, when I did my tests I did not have this behavior, in fact it happens when you slot on an aerodrome which is the right color after CAPTURE, sometimes it does it right away, sometimes after a while, it sends you back to the spectators... here is the error in the log, I don't understand...:( NFO LuaNET: [Perun] Sending event data, event: change_slot, arg1:null, arg2:null, content: BLUE player TA_FIndo changed slot to FA-18C_hornet (0) 2022-03-19 22:16:46.226 INFO LuaNET: [Perun] Sending stats data 2022-03-19 22:16:46.226 WARNING LOG: 1 duplicate message(s) skipped. 2022-03-19 22:16:46.226 INFO LuaNET: SSB - Player Selected slot - player: TA_FIndo side:2 slot: 1079 ucid: e7924aa6bb77ae459d557cb32a7c26b0 2022-03-19 22:16:46.226 INFO LuaNET: [Perun] Sending chat message 2022-03-19 22:16:46.226 INFO LuaNET: SSB - ALLOWING Aircraft Slot - player: TA_FIndo side:2 slot: 1079 ucid: e7924aa6bb77ae459d557cb32a7c26b0 2022-03-19 22:16:46.227 INFO LuaNET: [Perun] Sending chat message 2022-03-19 22:17:01.982 INFO NET: client[8] is ready to start 2022-03-19 22:17:01.987 INFO NET: spawning client[8] 2022-03-19 22:17:02.878 INFO NET: client[8] started 2022-03-19 22:17:03.159 INFO Scripting: event:type=birth,initiatorPilotName=TA_FIndo,place=Sukhumi-Babushara,t=88350.964,placeDisplayName=Sukhumi-Babushara,initiatorMissionID=1079, 2022-03-19 22:17:03.159 INFO SCRIPTING: 12819( -1)/I: DATABASE00003.function({[1]=Player Joined:,[2]=TA_FIndo,}) 2022-03-19 22:17:04.829 INFO Scripting: event:type=base captured,place=Krasnodar-Center,t=88352.908,placeDisplayName=Krasnodar Centre,initiatorMissionID=571, 2022-03-19 22:17:04.903 INFO LuaNET: SSB - REJECTING Slot - force spectators - 6 2022-03-19 22:17:04.903 INFO NET: release unit 1079 2022-03-19 22:17:04.903 INFO Scripting: event:type=relinquished,initiatorPilotName=TA_FIndo,target=F-18C Sukhumi-1,t=88352.974,targetMissionID=1079, 2022-03-19 22:17:04.904 INFO SCRIPTING: 44024( -1)/E: CARGO_GROUP462457.function({[IniGroupName]=F-18C Sukhumi,[IniUnitName]=F-18C Sukhumi-1,[time]=88352.974,[IniGroup]={[Attribute]={[AIR_OTHER]=Air_OtherAir,[AIR_TRANSPORTHELO]=Air_TransportHelo,[GROUND_APC]=Ground_APC,[AIR_FIGHTER]=Air_Fighter,[NAVAL_WARSHIP]=Naval_WarShip,[AIR_UAV]=Air_UAV,[AIR_BOMBER]=Air_Bomber,[GROUND_SAM]=Ground_SAM,[AIR_ATTACKHELO]=Air_AttackHelo,[GROUND_AAA]=Ground_AAA,[GROUND_INFANTRY]=Ground_Infantry,[AIR_TRANSPORTPLANE]=Air_TransportPlane,[AIR_AWACS]=Air_AWACS,[NAVAL_UNARMEDSHIP]=Naval_UnarmedShip,[NAVAL_OTHER]=Naval_OtherNaval,[GROUND_ARTILLERY]=Ground_Artillery,[GROUND_TANK]=Ground_Tank,[GROUND_TRAIN]=Ground_Train,[GROUND_EWR]=Ground_EWR,[GROUND_OTHER]=Ground_OtherGround,[NAVAL_AIRCRAFTCARRIER]=Naval_AircraftCarrier,[NAVAL_ARMEDSHIP]=Naval_ArmedShip,[AIR_TANKER]=Air_Tanker,[GROUND_TRUCK]=Ground_Truck,[OTHER_UNKNOWN]=Other_Unknown,},[Takeoff]={[Air]=1,[Hot]=3,[Runway]=2,[Cold]=4,},[GroupName]=F-18C Sukhumi,[ClassName]=GROUP,},[IniDCSGroupName]=F-18C Sukhumi,[IniPlayerName]=TA_FIndo,[initiator]={[id_]=16778502,},[id]=21,[IniDCSUnitName]=F-18C Sukhumi-1,[IniTypeName]=FA-18C_hornet,[IniCategory]=0,[IniObjectCategory]=1,[IniUnit]={[ClassName]=UNIT,[UnitName]=F-18C Sukhumi-1,},[IniCoalition]=2,[IniDCSUnit]=,[IniDCSGroup]={[id_]=364,},}) 2022-03-19 22:17:04.904 INFO SCRIPTING: 44024( -1)/E: CARGO_GROUP593257.function({[IniGroupName]=F-18C Sukhumi,[IniUnitName]=F-18C Sukhumi-1,[time]=88352.974,[IniGroup]={[Attribute]={[AIR_OTHER]=Air_OtherAir,[AIR_TRANSPORTHELO]=Air_TransportHelo,[GROUND_APC]=Ground_APC,[AIR_FIGHTER]=Air_Fighter,[NAVAL_WARSHIP]=Naval_WarShip,[AIR_UAV]=Air_UAV,[AIR_BOMBER]=Air_Bomber,[GROUND_SAM]=Ground_SAM,[AIR_ATTACKHELO]=Air_AttackHelo,[GROUND_AAA]=Ground_AAA,[GROUND_INFANTRY]=Ground_Infantry,[AIR_TRANSPORTPLANE]=Air_TransportPlane,[AIR_AWACS]=Air_AWACS,[NAVAL_UNARMEDSHIP]=Naval_UnarmedShip,[NAVAL_OTHER]=Naval_OtherNaval,[GROUND_ARTILLERY]=Ground_Artillery,[GROUND_TANK]=Ground_Tank,[GROUND_TRAIN]=Ground_Train,[GROUND_EWR]=Ground_EWR,[GROUND_OTHER]=Ground_OtherGround,[NAVAL_AIRCRAFTCARRIER]=Naval_AircraftCarrier,[NAVAL_ARMEDSHIP]=Naval_ArmedShip,[AIR_TANKER]=Air_Tanker,[GROUND_TRUCK]=Ground_Truck,[OTHER_UNKNOWN]=Other_Unknown,},[Takeoff]={[Air]=1,[Hot]=3,[Runway]=2,[Cold]=4,},[GroupName]=F-18C Sukhumi,[ClassName]=GROUP,},[IniDCSGroupName]=F-18C Sukhumi,[IniPlayerName]=TA_FIndo,[initiator]={[id_]=16778502,},[id]=21,[IniDCSUnitName]=F-18C Sukhumi-1,[IniTypeName]=FA-18C_hornet,[IniCategory]=0,[IniObjectCategory]=1,[IniUnit]={[ClassName]=UNIT,[UnitName]=F-18C Sukhumi-1,},[IniCoalition]=2,[IniDCSUnit]=,[IniDCSGroup]={[id_]=364,},}) 2022-03-19 22:17:04.905 INFO SCRIPTING: 44049( -1)/E: CARGO_GROUP593257.function({[1]=Cargo group destroyed,}) 2022-03-19 22:17:04.905 INFO SCRIPTING: 44024( -1)/E: CARGO_GROUP500923.function({[IniGroupName]=F-18C Sukhumi,[IniUnitName]=F-18C Sukhumi-1,[time]=88352.974,[IniGroup]={[Attribute]={[AIR_OTHER]=Air_OtherAir,[AIR_TRANSPORTHELO]=Air_TransportHelo,[GROUND_APC]=Ground_APC,[AIR_FIGHTER]=Air_Fighter,[NAVAL_WARSHIP]=Naval_WarShip,[AIR_UAV]=Air_UAV,[AIR_BOMBER]=Air_Bomber,[GROUND_SAM]=Ground_SAM,[AIR_ATTACKHELO]=Air_AttackHelo,[GROUND_AAA]=Ground_AAA,[GROUND_INFANTRY]=Ground_Infantry,[AIR_TRANSPORTPLANE]=Air_TransportPlane,[AIR_AWACS]=Air_AWACS,[NAVAL_UNARMEDSHIP]=Naval_UnarmedShip,[NAVAL_OTHER]=Naval_OtherNaval,[GROUND_ARTILLERY]=Ground_Artillery,[GROUND_TANK]=Ground_Tank,[GROUND_TRAIN]=Ground_Train,[GROUND_EWR]=Ground_EWR,[GROUND_OTHER]=Ground_OtherGround,[NAVAL_AIRCRAFTCARRIER]=Naval_AircraftCarrier,[NAVAL_ARMEDSHIP]=Naval_ArmedShip,[AIR_TANKER]=Air_Tanker,[GROUND_TRUCK]=Ground_Truck,[OTHER_UNKNOWN]=Other_Unknown,},[Takeoff]={[Air]=1,[Hot]=3,[Runway]=2,[Cold]=4,},[GroupName]=F-18C Sukhumi,[ClassName]=GROUP,},[IniDCSGroupName]=F-18C Sukhumi,[IniPlayerName]=TA_FIndo,[initiator]={[id_]=16778502,},[id]=21,[IniDCSUnitName]=F-18C Sukhumi-1,[IniTypeName]=FA-18C_hornet,[IniCategory]=0,[IniObjectCategory]=1,[IniUnit]={[ClassName]=UNIT,[UnitName]=F-18C Sukhumi-1,},[IniCoalition]=2,[IniDCSUnit]=,[IniDCSGroup]={[id_]=364,},}) 2022-03-19 22:17:04.905 INFO SCRIPTING: 44049( -1)/E: CARGO_GROUP500923.function({[1]=Cargo group destroyed,}) 2022-03-19 22:17:04.905 INFO SCRIPTING: 12889( -1)/I: DATABASE00003.function({[1]=Player Left:,[2]=TA_FIndo,}) 2022-03-19 22:17:04.908 INFO NET: client[6] occupied unit 2022-03-19 22:17:04.909 INFO LuaNET: [Perun] Sending chat message 2022-03-19 22:17:04.909 INFO LuaNET: [Perun] Sending event data, event: change_slot, arg1:null, arg2:null, content: ? player TA_FIndo changed slot to ? (-1) 2022-03-19 22:17:04.909 INFO LuaNET: [Perun] Sending stats data 2022-03-19 22:17:04.909 WARNING LOG: 1 duplicate message(s) skipped. 2022-03-19 22:17:04.909 INFO LuaNET: [Perun] Sending event data, event: change_slot, arg1:null, arg2:null, content: ? player TA_FIndo changed slot to ? (-1) 2022-03-19 22:17:04.909 INFO LuaNET: [Perun] Sending stats data 2022-03-19 22:17:04.909 WARNING LOG: 1 duplicate message(s) skipped. 2022-03-19 22:17:04.909 INFO LuaNET: [Perun] Sending event data, event: change_slot, arg1:null, arg2:null, content: ? player TA_FIndo changed slot to ? (-1) 2022-03-19 22:17:04.909 INFO LuaNET: [Perun] Sending stats data 2022-03-19 22:17:04.910 WARNING LOG: 1 duplicate message(s) skipped. 2022-03-19 22:17:04.910 INFO LuaNET: [Perun] Sending chat message 2022-03-19 22:17:05.066 INFO Scripting: event:type=base captured,place=Novorossiysk,t=88353.146,placeDisplayName=Novorossiysk,initiatorMissionID=26, 2022-03-19 22:17:05.303 INFO Scripting: event:type=base captured,place=Krymsk,t=88353.384,placeDisplayName=Krymsk,initiatorMissionID=569, 2022-03-19 22:17:05.551 INFO Scripting: event:type=base captured,place=Maykop-Khanskaya,t=88353.622,placeDisplayName=Maykop-Khanskaya,initiatorMissionID=576, 2022-03-19 22:17:05.786 INFO Scripting: event:type=base captured,place=Gelendzhik,t=88353.86,placeDisplayName=Gelendzhik,initiatorMissionID=566, 2022-03-19 22:17:05.972 INFO NET: client[7] is ready to start 2022-03-19 22:17:05.978 INFO NET: spawning client[7] 2022-03-19 22:17:06.918 INFO NET: client[7] started 2022-03-19 22:17:06.938 INFO Scripting: event:type=base captured,place=Sochi-Adler,t=88354.098,placeDisplayName=Sochi-Adler,initiatorMissionID=932, 2022-03-19 22:17:07.002 INFO Scripting: event:type=base captured,place=Krasnodar-Pashkovsky,t=88354.336,placeDisplayName=Krasnodar-Pashkovsky,initiatorMissionID=843, 2022-03-19 22:17:07.069 INFO Scripting: event:type=base captured,place=Sukhumi-Babushara,t=88354.574,placeDisplayName=Sukhumi-Babushara,initiatorMissionID=1000828, 2022-03-19 22:17:07.930 INFO Scripting: event:type=base captured,place=Mineralnye Vody,t=88356.003,placeDisplayName=Mineralnye Vody,initiatorMissionID=808, 2022-03-19 22:17:08.166 INFO Scripting: event:type=base captured,place=Nalchik,t=88356.241,placeDisplayName=Nalchik,initiatorMissionID=777, 2022-03-19 22:17:08.400 INFO Scripting: event:type=base captured,place=Mozdok,t=88356.479,placeDisplayName=Mozdok,initiatorMissionID=589, 2022-03-19 22:17:09.353 INFO Scripting: event:type=base captured,place=Beslan,t=88357.431,placeDisplayName=Beslan,initiatorMissionID=766, 2022-03-19 22:17:10.308 INFO Scripting: event:type=base captured,place=Krymsk,t=88358.384,placeDisplayName=Krymsk,initiatorMissionID=569, 2022-03-19 22:17:10.543 INFO Scripting: event:type=base captured,place=Maykop-Khanskaya,t=88358.622,placeDisplayName=Maykop-Khanskaya,initiatorMissionID=576, 2022-03-19 22:17:10.777 INFO Scripting: event:type=base captured,place=Gelendzhik,t=88358.86,placeDisplayName=Gelendzhik,initiatorMissionID=566, 2022-03-19 22:17:11.024 INFO Scripting: event:type=base captured,place=Sochi-Adler,t=88359.098,placeDisplayName=Sochi-Adler,initiatorMissionID=932, 2022-03-19 22:17:11.259 INFO Scripting: event:type=base captured,place=Krasnodar-Pashkovsky,t=88359.336,placeDisplayName=Krasnodar-Pashkovsky,initiatorMissionID=843, 2022-03-19 22:17:11.495 INFO Scripting: event:type=base captured,place=Sukhumi-Babushara,t=88359.574,placeDisplayName=Sukhumi-Babushara,initiatorMissionID=1000828, 2022-03-19 22:17:12.932 INFO Scripting: event:type=base captured,place=Mineralnye Vody,t=88361.003,placeDisplayName=Mineralnye Vody,initiatorMissionID=808, 2022-03-19 22:17:13.165 INFO Scripting: event:type=base captured,place=Nalchik,t=88361.241,placeDisplayName=Nalchik,initiatorMissionID=777, 2022-03-19 22:17:13.401 INFO Scripting: event:type=base captured,place=Mozdok,t=88361.479,placeDisplayName=Mozdok,initiatorMissionID=589, 2022-03-19 22:17:14.352 INFO Scripting: event:type=base captured,place=Beslan,t=88362.431,placeDisplayName=Beslan,initiatorMissionID=766, 2022-03-19 22:17:14.836 INFO Scripting: event:type=base captured,place=Krasnodar-Center,t=88362.908,placeDisplayName=Krasnodar Centre,initiatorMissionID=571, 2022-03-19 22:17:15.070 INFO Scripting: event:type=base captured,place=Novorossiysk,t=88363.146,placeDisplayName=Novorossiysk,initiatorMissionID=26, 2022-03-19 22:17:28.489 INFO Scripting: event:type=start shooting,initiatorPilotName=Azuriel,t=88376.56,weapon=GAU_12,initiatorMissionID=686, 2022-03-19 22:17:29.495 INFO Scripting: event:type=hit,initiatorPilotName=Azuriel,target=SNR_75V,t=88377.565,initiatorMissionID=686,targetMissionID=212, 2022-03-19 22:17:29.496 INFO Scripting: event:type=bda,initiatorPilotName=Azuriel,target=SNR_75V,t=88377.565,initiatorMissionID=686,targetMissionID=212, 2022-03-19 22:17:29.704 INFO Scripting: event:type=end shooting,initiatorPilotName=Azuriel,t=88377.784,weapon=GAU_12,initiatorMissionID=686, 2022-03-19 22:17:30.245 INFO LuaNET: SLMOD WARNING: SlmodStats - nil weapon in hit event, and no weapons fired by client! 2022-03-19 22:17:38.308 INFO Scripting: event:t=88386.379,type=dead,initiatorMissionID=219, 2022-03-19 22:17:38.309 INFO SCRIPTING: 44024( -1)/E: CARGO_GROUP593257.function({[IniGroupName]=Oktyabrskoe - SA-2,[IniDCSGroup]={[id_]=40,},[IniUnit]={[ClassName]=UNIT,[UnitName]=Oktyabrskoe - SA-2 Supply Truck 1,},[initiator]={[id_]=16853505,},[id]=8,[IniCoalition]=1,[IniDCSUnitName]=Oktyabrskoe - SA-2 Supply Truck 1,[IniUnitName]=Oktyabrskoe - SA-2 Supply Truck 1,[IniCategory]=2,[IniTypeName]=Ural-375,[time]=88386.379,[IniGroup]={[Attribute]={[AIR_OTHER]=Air_OtherAir,[AIR_TRANSPORTHELO]=Air_TransportHelo,[GROUND_APC]=Ground_APC,[AIR_FIGHTER]=Air_Fighter,[NAVAL_WARSHIP]=Naval_WarShip,[AIR_UAV]=Air_UAV,[AIR_BOMBER]=Air_Bomber,[GROUND_SAM]=Ground_SAM,[AIR_ATTACKHELO]=Air_AttackHelo,[GROUND_AAA]=Ground_AAA,[GROUND_INFANTRY]=Ground_Infantry,[AIR_TRANSPORTPLANE]=Air_TransportPlane,[AIR_AWACS]=Air_AWACS,[NAVAL_UNARMEDSHIP]=Naval_UnarmedShip,[NAVAL_OTHER]=Naval_OtherNaval,[GROUND_ARTILLERY]=Ground_Artillery,[GROUND_TANK]=Ground_Tank,[GROUND_TRAIN]=Ground_Train,[GROUND_EWR]=Ground_EWR,[GROUND_OTHER]=Ground_OtherGround,[NAVAL_AIRCRAFTCARRIER]=Naval_AircraftCarrier,[NAVAL_ARMEDSHIP]=Naval_ArmedShip,[AIR_TANKER]=Air_Tanker,[GROUND_TRUCK]=Ground_Truck,[OTHER_UNKNOWN]=Other_Unknown,},[Takeoff]={[Air]=1,[Hot]=3,[Runway]=2,[Cold]=4,},[GroupName]=Oktyabrskoe - SA-2,[ClassName]=GROUP,},[IniObjectCategory]=1,[IniDCSUnit]=,[IniDCSGroupName]=Oktyabrskoe - SA-2,}) 2022-03-19 22:17:38.309 INFO SCRIPTING: 44049( -1)/E: CARGO_GROUP593257.function({[1]=Cargo group destroyed,}) 2022-03-19 22:17:38.309 INFO SCRIPTING: 44024( -1)/E: CARGO_GROUP462457.function({[IniGroupName]=Oktyabrskoe - SA-2,[IniDCSGroup]={[id_]=40,},[IniUnit]={[ClassName]=UNIT,[UnitName]=Oktyabrskoe - SA-2 Supply Truck 1,},[initiator]={[id_]=16853505,},[id]=8,[IniCoalition]=1,[IniDCSUnitName]=Oktyabrskoe - SA-2 Supply Truck 1,[IniUnitName]=Oktyabrskoe - SA-2 Supply Truck 1,[IniCategory]=2,[IniTypeName]=Ural-375,[time]=88386.379,[IniGroup]={[Attribute]={[AIR_OTHER]=Air_OtherAir,[AIR_TRANSPORTHELO]=Air_TransportHelo,[GROUND_APC]=Ground_APC,[AIR_FIGHTER]=Air_Fighter,[NAVAL_WARSHIP]=Naval_WarShip,[AIR_UAV]=Air_UAV,[AIR_BOMBER]=Air_Bomber,[GROUND_SAM]=Ground_SAM,[AIR_ATTACKHELO]=Air_AttackHelo,[GROUND_AAA]=Ground_AAA,[GROUND_INFANTRY]=Ground_Infantry,[AIR_TRANSPORTPLANE]=Air_TransportPlane,[AIR_AWACS]=Air_AWACS,[NAVAL_UNARMEDSHIP]=Naval_UnarmedShip,[NAVAL_OTHER]=Naval_OtherNaval,[GROUND_ARTILLERY]=Ground_Artillery,[GROUND_TANK]=Ground_Tank,[GROUND_TRAIN]=Ground_Train,[GROUND_EWR]=Ground_EWR,[GROUND_OTHER]=Ground_OtherGround,[NAVAL_AIRCRAFTCARRIER]=Naval_AircraftCarrier,[NAVAL_ARMEDSHIP]=Naval_ArmedShip,[AIR_TANKER]=Air_Tanker,[GROUND_TRUCK]=Ground_Truck,[OTHER_UNKNOWN]=Other_Unknown,},[Takeoff]={[Air]=1,[Hot]=3,[Runway]=2,[Cold]=4,},[GroupName]=Oktyabrskoe - SA-2,[ClassName]=GROUP,},[IniObjectCategory]=1,[IniDCSUnit]=,[IniDCSGroupName]=Oktyabrskoe - SA-2,}) 2022-03-19 22:17:38.310 INFO SCRIPTING: 44024( -1)/E: CARGO_GROUP500923.function({[IniGroupName]=Oktyabrskoe - SA-2,[IniDCSGroup]={[id_]=40,},[IniUnit]={[ClassName]=UNIT,[UnitName]=Oktyabrskoe - SA-2 Supply Truck 1,},[initiator]={[id_]=16853505,},[id]=8,[IniCoalition]=1,[IniDCSUnitName]=Oktyabrskoe - SA-2 Supply Truck 1,[IniUnitName]=Oktyabrskoe - SA-2 Supply Truck 1,[IniCategory]=2,[IniTypeName]=Ural-375,[time]=88386.379,[IniGroup]={[Attribute]={[AIR_OTHER]=Air_OtherAir,[AIR_TRANSPORTHELO]=Air_TransportHelo,[GROUND_APC]=Ground_APC,[AIR_FIGHTER]=Air_Fighter,[NAVAL_WARSHIP]=Naval_WarShip,[AIR_UAV]=Air_UAV,[AIR_BOMBER]=Air_Bomber,[GROUND_SAM]=Ground_SAM,[AIR_ATTACKHELO]=Air_AttackHelo,[GROUND_AAA]=Ground_AAA,[GROUND_INFANTRY]=Ground_Infantry,[AIR_TRANSPORTPLANE]=Air_TransportPlane,[AIR_AWACS]=Air_AWACS,[NAVAL_UNARMEDSHIP]=Naval_UnarmedShip,[NAVAL_OTHER]=Naval_OtherNaval,[GROUND_ARTILLERY]=Ground_Artillery,[GROUND_TANK]=Ground_Tank,[GROUND_TRAIN]=Ground_Train,[GROUND_EWR]=Ground_EWR,[GROUND_OTHER]=Ground_OtherGround,[NAVAL_AIRCRAFTCARRIER]=Naval_AircraftCarrier,[NAVAL_ARMEDSHIP]=Naval_ArmedShip,[AIR_TANKER]=Air_Tanker,[GROUND_TRUCK]=Ground_Truck,[OTHER_UNKNOWN]=Other_Unknown,},[Takeoff]={[Air]=1,[Hot]=3,[Runway]=2,[Cold]=4,},[GroupName]=Oktyabrskoe - SA-2,[ClassName]=GROUP,},[IniObjectCategory]=1,[IniDCSUnit]=,[IniDCSGroupName]=Oktyabrskoe - SA-2,}) 2022-03-19 22:17:38.310 INFO SCRIPTING: 44049( -1)/E: CARGO_GROUP500923.function({[1]=Cargo group destroyed,}) 2022-03-19 22:17:38.311 INFO Scripting: event:type=kill,initiatorPilotName=Azuriel,weapon=,target=Ural-375,t=88386.379,initiatorMissionID=686,targetMissionID=219, Edited March 19, 2022 by TA_Findo
cfrag Posted March 20, 2022 Author Posted March 20, 2022 I looked into the logic of the scripts (SSB and SSBclient), and here is my analysis of what likely has happened You took of in an airframe that spawned on airfield A, while that airfield was owned by your faction A short while later, with you still flying that airframe, ownership of airfied A changes to the opposition SSBClient detects the change, and orders all slots closed for that airfield Closing the slot will unfortunately (when using standard SSB) result in SSB to kick the player when they are in-game (because SSB can't distinguish between someone who just now occupied a slot, and someone who has before occupied the slot before it changed hands). So we have a conflict between the airfield ownership / spawning and blocking functionality and the ability to detect change of hands in airfields. At the time being I have nor easy fix, this may require some additional code to allow planes that departed from now lost airfields to remain viable until their players have left them.
TA_Findo Posted March 20, 2022 Posted March 20, 2022 yes, your logic could have been correct, but unfortunately the airfield does not change hands
Punisher74 Posted March 27, 2022 Posted March 27, 2022 (edited) How do you turn off the notifications very 60 secs, when you have 5 future airfields that can be captured with aircraft at each the list can be quiet long? Edited March 27, 2022 by Punisher74 Thanks, Lt. Commander Jason "Punisher" M Hardware: i7 10700K 5 GHz Quad Core, Water-cooled , 32GBs 2400 DDR4 RAM, MSI Intel Z470A GAMING MB, MSI RTX 3080 GPU W/10GBs GDDR6X, 512GB NVME.2 SSD, 1TB NVME.2 SSD, 2TB External SSD, 2 512Gb SSD's & 1 350 Gb HARDDRIVE, WinWing Orion 2 Stick Base and Throttle Base, Quest 2, Windows 11 (64bit)
cfrag Posted March 28, 2022 Author Posted March 28, 2022 9 hours ago, Punisher74 said: How do you turn off the notifications very 60 secs It looks like ssbClient is set to 'verbose', which (silly me) is the default in the script. Change this line cfxSSBClient.verbose = true to cfxSSBClient.verbose = false That should help
Badass1982 Posted March 11, 2023 Posted March 11, 2023 Is it normal for this script to produce entries in the log that read " Airbase doesn't exist"? This wasn't happening until the new update just came out.
cfrag Posted March 11, 2023 Author Posted March 11, 2023 1 hour ago, Badass1982 said: Is it normal for this script to produce entries in the log that read " Airbase doesn't exist"? No, and usually, DML scripts don't write to the log, always to screen. If you have something for me to look at, please PM me so I can verify and make it go away.
cfrag Posted March 24, 2023 Author Posted March 24, 2023 @Badass1982 thankfully helped to identify a bug that I somehow already prophesized about when I released the original code, and then promptly forgot: the fact that unlike map-based airfields, user-placed airfields like FARPs and carriers can vanish. The latest update (see first post) corrects that. Enjoy, -ch
Kanelbolle Posted April 7, 2023 Posted April 7, 2023 (edited) Edit: This seam to have been fixed in the last OB patch: - MP Events. Base captured events each time a player joins the server - fixed. Hi! awesome script! Makes blocking slots a lot easier! Just wanted to let you know there is an issue with players getting kicked out of the slot if you use "Neutral Airfields" in the ME and add slots to them and you have cfxSSBClient.allowNeutralFields = false If players are spawning in a captured airbase that was Neutral but not anymore. Example Blue now. The players will get kicked out of the slot every time a player joins the Multiplayer Server. DCS in ED's wisdom resets all Airfields that are set to Neutral in ME back to Neutral for 1 second and back to the captured side every time a client joins. (Join in progress update) The Capture event is responsible for this. In my capture the base script i circumvented this problem by saving the state of every airbase to FLAGS. And if it changed the script checks the flag if it is the right side. The Capture event in the script only updated the flag if it changed to Red or blue. So the slots would not be blocked in case of a player joining the server. Now cfxSSBClient.allowNeutralFields = true will fix this, but if you want Neutral Airfields that you can not spawn on in the game, this is not possible in the current version unless you code something that closes the airfield with "cfxSSBClient.closeAirfieldNamed" when it is Neutral. Hope this helps Have a good one! Edited April 13, 2023 by Kanelbolle MP Events. Base captured events each time a player joins the server - fixed. WARGAMES Servers: https://forum.dcs.world/topic/301046-wargames-server-pvp-and-pve-campaign-servers/ Scripts: RGC & SPGG https://github.com/AGluttonForPunishment/
xcwendy Posted May 2, 2023 Posted May 2, 2023 Hello, I'm guessing this script no longer works as it's outdated? Went through all the steps, when launching the server, i get the message that ssb is running, but it simply doesn't do anything. I have the original ssb in my Hooks folder as instructed and the ssbClient standalone in my scripts folder as well as the appropriate trigger in the mission editor.
cfrag Posted May 2, 2023 Author Posted May 2, 2023 54 minutes ago, xcwendy said: but it simply doesn't do anything I think it's working (the last update was a couple of weeks ago). When you report that it doesn't do anything, maybe we can start tracking down a potential bug: what were you expecting that it does? Put differently: why is what you see happening not what you were expecting?
xcwendy Posted May 3, 2023 Posted May 3, 2023 (edited) 22 hours ago, cfrag said: I think it's working (the last update was a couple of weeks ago). When you report that it doesn't do anything, maybe we can start tracking down a potential bug: what were you expecting that it does? Put differently: why is what you see happening not what you were expecting? Well it doesn't block slots when the airfield is the opposite faction. Also the test mission downloaded from here itself doesn't work (doesn't block slots on the test mission either). Edited May 3, 2023 by xcwendy
cfrag Posted May 3, 2023 Author Posted May 3, 2023 6 minutes ago, xcwendy said: Well it doesn't block slots when the airfield is the opposite faction. Just to be on the safe side: the mission is run as multiplayer, not single mission "Blocking" doesn't mean that the slot is not available, it means that when you select a blocked slot, you simply can't enter the game. If above is true, let's have a look at the mission to find out what went wrong and fix it
xcwendy Posted May 5, 2023 Posted May 5, 2023 (edited) On 5/3/2023 at 4:33 PM, cfrag said: Just to be on the safe side: the mission is run as multiplayer, not single mission "Blocking" doesn't mean that the slot is not available, it means that when you select a blocked slot, you simply can't enter the game. If above is true, let's have a look at the mission to find out what went wrong and fix it Sorry for the long response time, exams are in order. The mission is run by going into multiplayer and clicking "new server" and starting the server. When selecting a slot that is supposed to be "blocked", you are able to spawn in like the script doesn't exist. I suspect it's something wrong with installing the script itself as the provided test mission doesn't block slots either. So I would start there. Edited May 5, 2023 by xcwendy
Recommended Posts