Page 1 of 1

Force players into vehicle not working, sometimes

Posted: Sat Mar 02, 2013 8:39 pm
by Jaspo
Hidden/Spoiler:
ActivateRegion("mapbounds")
local VehspawnNum = 1
local VehspawnMaxNum = 4
local FirstSpawn = 1
local ID1
local ID2
local ID3
local ID4

testfunction = OnEnterRegion(
function(region, player)
if IsCharacterInRegion(player, "mapbounds") then
if FirstSpawn == 0 then
if player == ID1 then
EnterVehicle(player, "Vehspawn1")
EntityFlyerTakeOff("Vehspawn1")

end
if player == ID2 then
EnterVehicle(player, "Vehspawn2")
EntityFlyerTakeOff("Vehspawn2")

end
if player == ID3 then
EnterVehicle(player, "Vehspawn3")
EntityFlyerTakeOff("Vehspawn3")

end
if player == ID4 then
EnterVehicle(player, "Vehspawn4")
EntityFlyerTakeOff("Vehspawn4")

MissionDefeat(1) --this works, so why doesn't the stuff above it?
end
end
if FirstSpawn == 1 then
EnterVehicle(player, "Vehspawn" .. VehspawnNum)
EntityFlyerTakeOff("Vehspawn" .. VehspawnNum)
if VehspawnNum == 1 then
ID1 = player
end
if VehspawnNum == 2 then
ID2 = player
end
if VehspawnNum == 3 then
ID3 = player
end
if VehspawnNum == 4 then
ID4 = player
end
VehspawnNum = VehspawnNum + 1
if VehspawnNum > VehspawnMaxNum then
if FirstSpawn == 1 then
FirstSpawn = 0
end
VehspawnNum = 1
end
end
end
end,"mapbounds"
)
Hello, gametoast. The above code is for the podrace mode I'm working on. How it is supposed to work:
When all players (all on the same team) spawn, they are each forced into a different podracer.
Also, the identity of each individual player is copied into an "ID" variable, to be used the next time that player spawns.
Currently there are 4 players, and 4 podracer spawns (named Vehspawn1-4), which have their respawn times set to 0, with only 1 vehicle allowed per vehicle spawn. Since the human player always spawns last, he will end up in the 4th podracer. After all 4 players have spawned once, the variable "FirstSpawn" is changed from 1 to 0, making the other chunk of code operative instead (it is located above rather than below the "if FirstSpawn == 1" part so that it doesn't run after the 4th player is spawned the first time)...this chunk of code uses the ID variables to match the players to their vehicle spawns, so they spawn in the same vehicle they were in before.

Wonderful, huh? Except that for some reason known only to the insanity of Lua logic, while the commands to force players into vehicles and send them rocketing forth automatically works perfectly for the first spawn, the exact same code does absolutely nothing in the second chunk of code...the players all spawn on the cp spawn path. I know for a fact that the code is being read correctly and the issue isn't that it's getting skipped due to a glitch elsewhere, because you see where underneath the 4th player's vehicle commands, there's a scenario loss function? Well, that works perfectly...the AI crash and respawn, nothing happens, I crash and respawn, DEFEAT. As I mentioned, the natural order of things makes the human player 4.
As a sidenote, I see I'll need to address the issue of what happens if an AI crashes before the player spawns.
The ultimate goal of all this is to teleport the vehicle spawns around the racecourse as the podracers move through it, to form a race checkpoint system. First, though, I've got to get the basic stuff that should work easily, to work. I've already had odd troubles with getting local sides to show up...I've even copied and pasted the exact code used from stock geonosis to try to get geonosians to show up, and they didn't...and then I saw that they made a mistake with the spelling of things (the old gen_inf instead of geo_inf) and fixed that...still didn't work. Looked at the locals code I hade done back on my Mustafar map, couldn't see anything different. Am I forgetting a non-mission script step that's necessary for getting local sides to work? I'm not trying to use any nonexistent units or anything like that. Earlier I had simply been trying to put the same pit mechanic that's been working fine for the main 2 sides, on local sides as well. Since that all didn't work, I'm trying to do the spawning this way instead, having everyone on the same team. Oh, and by the way, elsewhere in the code the humans are forced onto team 1. Multiplayer compatibility would need more wonderfully successful coding, I see.

Edit: I accidentally left out the variable initialization in the posted code at first, it's now included.

Re: Force players into vehicle not working, sometimes

Posted: Sat Mar 02, 2013 10:46 pm
by Marth8880
Agh... Would you mind posting your code properly formatted inside code tags, please? It's insanely difficult to read as it is currently. :o Thanks! :)

Re: Force players into vehicle not working, sometimes

Posted: Sat Mar 02, 2013 11:39 pm
by Jaspo
Here's the whole script in code format:
Do variables need to be given a value when initialized? I see I didn't do that with the ID variables.
Also - ShowAllUnitsOnMinimap("true") doesn't seem to do what it's supposed to.
Hidden/Spoiler:
[code]--
-- Copyright (c) 2005 Pandemic Studios, LLC. All rights reserved.
--

-- load the gametype script
ScriptCB_DoFile("ObjectiveConquest")
ScriptCB_DoFile("setup_teams")

-- REP Attacking (attacker is always #1)
REP = 1;
CIS = 2;
-- These variables do not change
ATT = REP;
DEF = CIS;


function ScriptPostLoad()


--This defines the CPs. These need to happen first
cp1 = CommandPost:New{name = "cp-1"}
cp2 = CommandPost:New{name = "cp-2"}
cp3 = CommandPost:New{name = "cp-3"}
cp4 = CommandPost:New{name = "cp-4"}



--This sets up the actual objective. This needs to happen after cp's are defined
conquest = ObjectiveConquest:New{teamATT = ATT, teamDEF = DEF,
textATT = "game.modes.con",
textDEF = "game.modes.con2",
multiplayerRules = true}

--This adds the CPs to the objective. This needs to happen after the objective is set up
conquest:AddCommandPost(cp1)
conquest:AddCommandPost(cp2)
conquest:AddCommandPost(cp3)
conquest:AddCommandPost(cp4)

conquest:Start()

ActivateRegion("mapbounds")
local VehspawnNum = 1
local VehspawnMaxNum = 4
local FirstSpawn = 1
local ID1
local ID2
local ID3
local ID4

testfunction = OnEnterRegion(
function(region, player)
if IsCharacterInRegion(player, "mapbounds") then
if FirstSpawn == 0 then
if player == ID1 then
EnterVehicle(player, "Vehspawn1")
EntityFlyerTakeOff("Vehspawn1")
end
if player == ID2 then
EnterVehicle(player, "Vehspawn2")
EntityFlyerTakeOff("Vehspawn2")
end
if player == ID3 then
EnterVehicle(player, "Vehspawn3")
EntityFlyerTakeOff("Vehspawn3")
end
if player == ID4 then
EnterVehicle(player, "Vehspawn4")
EntityFlyerTakeOff("Vehspawn4")
MissionDefeat(1)
end
end
if FirstSpawn == 1 then
EnterVehicle(player, "Vehspawn" .. VehspawnNum)
EntityFlyerTakeOff("Vehspawn" .. VehspawnNum)
if VehspawnNum == 1 then
ID1 = player
end
if VehspawnNum == 2 then
ID2 = player
end
if VehspawnNum == 3 then
ID3 = player
end
if VehspawnNum == 4 then
ID4 = player
end
VehspawnNum = VehspawnNum + 1
if VehspawnNum > VehspawnMaxNum then
if FirstSpawn == 1 then
FirstSpawn = 0
end
VehspawnNum = 1
end
end
end
end,"mapbounds"
)


end


---------------------------------------------------------------------------
-- FUNCTION: ScriptInit
-- PURPOSE: This function is only run once
-- INPUT:
-- OUTPUT:
-- NOTES: The name, 'ScriptInit' is a chosen convention, and each
-- mission script must contain a version of this function, as
-- it is called from C to start the mission.
---------------------------------------------------------------------------
function ScriptInit()

ReadDataFile("dc:Load\\common.lvl")
ReadDataFile("ingame.lvl")



SetMaxFlyHeight(8)
SetMinFlyHeight(2)
SetMaxPlayerFlyHeight (8)
SetMinPlayerFlyHeight (2)

SetMemoryPoolSize ("ClothData",20)
SetMemoryPoolSize ("Combo",50) -- should be ~ 2x number of jedi classes
SetMemoryPoolSize ("Combo::State",650) -- should be ~12x #Combo
SetMemoryPoolSize ("Combo::Transition",650) -- should be a bit bigger than #Combo::State
SetMemoryPoolSize ("Combo::Condition",650) -- should be a bit bigger than #Combo::State
SetMemoryPoolSize ("Combo::Attack",550) -- should be ~8-12x #Combo
SetMemoryPoolSize ("Combo::DamageSample",6000) -- should be ~8-12x #Combo::Attack
SetMemoryPoolSize ("Combo::Deflect",100) -- should be ~1x #combo

ReadDataFile("sound\\yav.lvl;yav1cw")

ReadDataFile("dc:SIDE\\POD.lvl",
"pod_fly_podracer1",
"pod_inf_engineer")

ReadDataFile("SIDE\\ALL.lvl",
"all_inf_engineer")

SetupTeams{
rep = {
team = REP,
units = 4,
reinforcements = -1,
soldier = { "pod_inf_engineer",4,5},
assault = { "pod_inf_engineer",4,5},
engineer = { "pod_inf_engineer",4,5},
sniper = { "pod_inf_engineer",4,5},
},
cis = {
team = CIS,
units = 0,
reinforcements = -1,
engineer = { "pod_inf_engineer",1,2},
},
}

-- SetTeamName(3, "podracer3")
-- SetUnitCount(3, 1)
-- SetReinforcementCount (3, 999)
-- AddUnitClass(3, "pod_inf_engineer",1, 2)

-- SetTeamName(4, "podracer4")
-- SetUnitCount(4, 1)
-- SetReinforcementCount (4, -1)
-- AddUnitClass(4, "pod_inf_engineer",1, 2)

-- SetTeamAsEnemy(3,ATT)
-- SetTeamAsEnemy(3,DEF)
-- SetTeamAsEnemy(ATT,3)
-- SetTeamAsEnemy(DEF,3)

-- SetTeamAsEnemy(4,ATT)
-- SetTeamAsEnemy(4,DEF)
-- SetTeamAsEnemy(ATT,4)
-- SetTeamAsEnemy(DEF,4)

-- SetTeamAsEnemy(3,4)
-- SetTeamAsEnemy(4,3)

--AllowAISpawn(2, "false")
--AllowAISpawn(3, "true")
--AllowAISpawn(4, "true")

ForceHumansOntoTeam1()


-- Level Stats
-- ClearWalkers()
AddWalkerType(0, 4) -- special -> droidekas
AddWalkerType(1, 0) -- 1x2 (1 pair of legs)
AddWalkerType(2, 0) -- 2x2 (2 pairs of legs)
AddWalkerType(3, 0) -- 3x2 (3 pairs of legs)
local weaponCnt = 1024
SetMemoryPoolSize("Aimer", 75)
SetMemoryPoolSize("AmmoCounter", weaponCnt)
SetMemoryPoolSize("BaseHint", 1024)
SetMemoryPoolSize("EnergyBar", weaponCnt)
SetMemoryPoolSize("EntityCloth", 32)
SetMemoryPoolSize("EntityFlyer", 32)
SetMemoryPoolSize("EntityHover", 32)
SetMemoryPoolSize("EntityLight", 200)
SetMemoryPoolSize("EntitySoundStream", 4)
SetMemoryPoolSize("EntitySoundStatic", 32)
SetMemoryPoolSize("MountedTurret", 32)
SetMemoryPoolSize("Navigator", 128)
SetMemoryPoolSize("Obstacle", 1024)
SetMemoryPoolSize("PathNode", 1024)
SetMemoryPoolSize("SoundSpaceRegion", 64)
SetMemoryPoolSize("TreeGridStack", 1024)
SetMemoryPoolSize("UnitAgent", 128)
SetMemoryPoolSize("UnitController", 128)
SetMemoryPoolSize("Weapon", weaponCnt)

SetSpawnDelay(10.0, 0.25)

ReadDataFile("dc:TCS\\TCS.lvl", "TCS_podrace")
SetDenseEnvironment("false")
ShowAllUnitsOnMinimap("true")



-- Sound

SetSoundEffect("ScopeDisplayZoomIn", "binocularzoomin")
SetSoundEffect("ScopeDisplayZoomOut", "binocularzoomout")

voiceSlow = OpenAudioStream("sound\\global.lvl", "rep_unit_vo_slow")
AudioStreamAppendSegments("sound\\global.lvl", "cis_unit_vo_slow", voiceSlow)
AudioStreamAppendSegments("sound\\global.lvl", "global_vo_slow", voiceSlow)

voiceQuick = OpenAudioStream("sound\\global.lvl", "rep_unit_vo_quick")
AudioStreamAppendSegments("sound\\global.lvl", "cis_unit_vo_quick", voiceQuick)

OpenAudioStream("sound\\global.lvl", "cw_music")
-- OpenAudioStream("sound\\global.lvl", "global_vo_quick")
-- OpenAudioStream("sound\\global.lvl", "global_vo_slow")
OpenAudioStream("sound\\yav.lvl", "yav1")
OpenAudioStream("sound\\yav.lvl", "yav1")
OpenAudioStream("sound\\yav.lvl", "yav1_emt")

SetBleedingVoiceOver(REP, REP, "rep_off_com_report_us_overwhelmed", 1)
SetBleedingVoiceOver(REP, CIS, "rep_off_com_report_enemy_losing", 1)
SetBleedingVoiceOver(CIS, REP, "cis_off_com_report_enemy_losing", 1)
SetBleedingVoiceOver(CIS, CIS, "cis_off_com_report_us_overwhelmed", 1)

--SetOutOfBoundsVoiceOver(2, "cisleaving")
--SetOutOfBoundsVoiceOver(1, "repleaving")



--SetAmbientMusic(REP, 1.0, "rep_yav_amb_start", 0,1)
--SetAmbientMusic(REP, 0.8, "rep_yav_amb_middle", 1,1)
--SetAmbientMusic(REP, 0.2, "rep_yav_amb_end", 2,1)
--SetAmbientMusic(CIS, 1.0, "cis_yav_amb_start", 0,1)
--SetAmbientMusic(CIS, 0.8, "cis_yav_amb_middle", 1,1)
--SetAmbientMusic(CIS, 0.2, "cis_yav_amb_end", 2,1)

SetAmbientMusic(REP, 1.0, "cis_hero_Grievous_lp", 0,1)
SetAmbientMusic(REP, 0.8, "cis_yav_amb_middle", 1,1)
SetAmbientMusic(REP, 0.2, "cis_yav_amb_end", 2,1)
SetAmbientMusic(CIS, 1.0, "cis_hero_Grievous_lp", 0,1)
SetAmbientMusic(CIS, 0.8, "cis_yav_amb_middle", 1,1)
SetAmbientMusic(CIS, 0.2, "cis_yav_amb_end", 2,1)

SetVictoryMusic(REP, "rep_yav_amb_victory")
SetDefeatMusic (REP, "rep_yav_amb_defeat")
SetVictoryMusic(CIS, "cis_yav_amb_victory")
SetDefeatMusic (CIS, "cis_yav_amb_defeat")

SetSoundEffect("ScopeDisplayZoomIn", "binocularzoomin")
SetSoundEffect("ScopeDisplayZoomOut", "binocularzoomout")
--SetSoundEffect("BirdScatter", "birdsFlySeq1")
--SetSoundEffect("WeaponUnableSelect", "com_weap_inf_weaponchange_null")
--SetSoundEffect("WeaponModeUnableSelect", "com_weap_inf_modechange_null")
SetSoundEffect("SpawnDisplayUnitChange", "shell_select_unit")
SetSoundEffect("SpawnDisplayUnitAccept", "shell_menu_enter")
SetSoundEffect("SpawnDisplaySpawnPointChange", "shell_select_change")
SetSoundEffect("SpawnDisplaySpawnPointAccept", "shell_menu_enter")
SetSoundEffect("SpawnDisplayBack", "shell_menu_exit")


--OpeningSateliteShot
AddCameraShot(0.637519, -0.027661, 0.769214, 0.033375, -2528.554932, 7.933463, -1212.458618);
end[/code]

Re: Force players into vehicle not working, sometimes

Posted: Sun Mar 03, 2013 12:41 am
by Marth8880
Thanks.
Jaspo wrote:Do variables need to be given a value when initialized? I see I didn't do that with the ID variables.
Probably. Try giving them all a nil value.
Jaspo wrote:Also - ShowAllUnitsOnMinimap("true") doesn't seem to do what it's supposed to.
It's probably something like ShowAllUnitsOnMinimap(1) or simply ShowAllUnitsOnMinimap() - most likely the latter, actually, I don't think I've really seen similar instances of the former before.

Re: Force players into vehicle not working, sometimes

Posted: Sun Mar 03, 2013 1:45 am
by CressAlbane
Could the problem possibly lie in the game not seeing the AI as "re-entering" the region, but the player does "re-enter" it?
Also, don't know why you're setting Vehspawnnum back to 1 after you've finished counting. Just a nitpick.
I'd give those variables initial values as well.

Re: Force players into vehicle not working, sometimes

Posted: Sun Mar 03, 2013 2:03 am
by Jaspo
I guess one thing to check is whether "borrowing" the mapbounds region for use as a control region is problematic...though again, the function appears to execute when its supposed to.

Is there something inherently wrong with the structure of nesting the vehicle-forcing functions inside an "if" statement inside a onenterregion function?

And what's the benefit or difference between using a number of "if" statements and using "if...else if" statements? Would "if...else if" work better here? Is there any difference at all?

@CressAlbane yes, the Vehspawnnum going back to 1 is just an unneccesary bit left over from previous renditions of the code...I'll get rid of it.
There's no difference in the game's treatment of AI and human players that I've seen with this code. Both spawn in vehicles and autolaunch the first time they spawn, and fail to do so from then on. According to what's been posted on these forums thus far on the topic, to spawn inside a region is one way to enter a region. And yes, my spawn paths are certainly inside the region (it is the mapbounds region after all)

Could the size of the map (extremely large) and the distance of the players from the center of it when they spawn (almost to the end of the extent to which they can be spawned without dying...too far out and units will die if they fall at all, I've discovered) be a factor in whether things work right or not?

Edit: Or might the problem have to do with the fact that the podracers have to respawn also, even though they should be in place by the time the player respawns (though maybe not with AI players), since the delay time for them respawning is set to 0? I could try having 2 podracers spawn per vehicle spawn to see if it changes anything, though it wouldn't really be a solution to the problem even if it worked since I don't want extra vehicles parked on the track.

Edit2: I noticed I had a slight error in the layout of the code before; it's fixed now:
Hidden/Spoiler:
[code]ActivateRegion("mapbounds")
local VehspawnNum = 1
local VehspawnMaxNum = 4
local FirstSpawn = 1
local ID1 = 0
local ID2 = 0
local ID3 = 0
local ID4 = 0

testfunction = OnEnterRegion(
function(region, player)
if IsCharacterInRegion(player, "mapbounds") then
if FirstSpawn == 0 then
if player == ID1 then
EnterVehicle(player, "Vehspawn1")
EntityFlyerTakeOff("Vehspawn1")
end
if player == ID2 then
EnterVehicle(player, "Vehspawn2")
EntityFlyerTakeOff("Vehspawn2")
end
if player == ID3 then
EnterVehicle(player, "Vehspawn3")
EntityFlyerTakeOff("Vehspawn3")
end
if player == ID4 then
EnterVehicle(player, "Vehspawn4")
EntityFlyerTakeOff("Vehspawn4")
MissionDefeat(1)
end
end
if FirstSpawn == 1 then
EnterVehicle(player, "Vehspawn" .. VehspawnNum)
EntityFlyerTakeOff("Vehspawn" .. VehspawnNum)
if VehspawnNum == 1 then
ID1 = player
end
if VehspawnNum == 2 then
ID2 = player
end
if VehspawnNum == 3 then
ID3 = player
end
if VehspawnNum == 4 then
ID4 = player
end
VehspawnNum = VehspawnNum + 1
if VehspawnNum > VehspawnMaxNum then
FirstSpawn = 0
end
end
end
end,
"mapbounds"
)[/code]

Re: Force players into vehicle not working, sometimes

Posted: Sun Mar 03, 2013 1:53 pm
by CressAlbane
I don't see anything inherently wrong with the flow of the code. You might be on to something with the vehicles not respawning yet. I would try duplicating the vehicle spawns and having a separate one for the second life.

Re: Force players into vehicle not working, sometimes

Posted: Wed Mar 06, 2013 7:24 pm
by Jaspo
According to the BF2 log, the game is simply sometimes unable to find the vehicle spawn objects (apparently at random)...perhaps this is a problem related to too high an object count in the map?

Assigning different vehicle spawns for the second spawn didn't help.

Re: Force players into vehicle not working, sometimes

Posted: Sun Mar 10, 2013 2:56 pm
by CressAlbane
Could be... try making a new map with only the relevant objects and see if the script works there. (What a pain, though...)

Re: Force players into vehicle not working, sometimes

Posted: Sun Mar 10, 2013 4:02 pm
by Marth8880
Jaspo wrote:

Code: Select all

local ID1 = 0
local ID2 = 0
local ID3 = 0
local ID4 = 0
By "give them a nil value", I literally meant a nil value. :lol: Like this:

Code: Select all

local ID1 = nil
local ID2 = nil
local ID3 = nil
local ID4 = nil

Re: Force players into vehicle not working, sometimes

Posted: Sun Mar 10, 2013 6:14 pm
by CressAlbane
I don't think that would make a difference, though.

Re: Force players into vehicle not working, sometimes

Posted: Mon Mar 11, 2013 5:42 pm
by [RDH]Zerted
ShowAllUnitsOnMinimap - I tired to add that into the FakeConsole but I couldn't figure out what it did. It might only work in SP games or not at all. Use my Example Finder tool (or something like grep) to find where the game's source code uses it (assuming it does... I don't remember anymore).

You should use if else statements whenever possible. They're faster and are more clear in terms of logic flow throughout your program. If you use two if statements, the second one will always be tested. If you use an if else if, then the second if condition is skipped if the first one was true.

Player location inside the region shouldn't matter. if you're concerned about that, put a print statement inside OnEnterRegion to make sure it's being called when expected.

The AIs that respawn are probably different from the original AI characters. SWBF2 cycles through all of the possible AI players. That's why you sometimes notice a longer list of AI player scores when a map ends despite not having that many AI players active at a time. You can get around this by storing which character took which vehicle. Then marking that vehicle as free when it's character dies. The next spawning unit takes the first free vehicle. You should print out the value of player anyway so you can see it happening.

You will probably have to mess around with the vehicle spawns. We worked on trying to get a good, generic Race Mode awhile back and I started with a similar path that you're currently on. I don't remember any specific vehicle spawn issues, but eventually I switch to directly creating vehicle objects. Those vehicles' primary weapons wouldn't work (secondary weapons worked) and the generic vehicle race mode was almost completely abandoned. That's not to say you can't get it working for your specific map.

Good luck.

You code doesn't work if someone dies before all 4 players get in a vehicle. Though, don't worry too much about those quality issues until the main features work.

You don't need to IsCharacterInRegion check. That OnEnterRegion should only be triggered when the region is mapbounds because of the "mapbounds" you have at the end of it.