Multiple Respawns Causes Bug [message #479262] |
Tue, 12 February 2013 17:36 |
Troll King
Messages: 56 Registered: June 2012 Location: Netherlands
Karma: 0
|
Recruit |
|
|
Setup:
- I have aprox. 40 spawnpoints.
- I kill ALL players at the exact same time by using Set_Delete_Pending.
- Players respawn all at the EXACT same spawnpoint.
Result: everybody gets stuck.
I don't think this should be happening when I have plenty of spawnpoints for the player to spawn safely. It even happens when there are only 2 players in-game.
LE set-up:
This is a modded M13.mix
I'm not sure if it happens on stock maps, I'm quiete sure it will.
I have NO modifications to my Renegade nor my Server files apart from the fact that I'm using SSGM plugins.
Also Known As: Neijwiert
|
|
|
Re: Multiple Respawns Causes Bug [message #479263 is a reply to message #479262] |
Tue, 12 February 2013 17:46 |
Troll King
Messages: 56 Registered: June 2012 Location: Netherlands
Karma: 0
|
Recruit |
|
|
Tested in stock C&C_Volcano.mix
Does not appear to be happening there somehow.
IMPORTANT NOTE:
I am killing everybody when they are a NULL model and when they spawn I instantly change their model to a valid other model.
(did not do this model changing in stock yet.)
Also Known As: Neijwiert
[Updated on: Tue, 12 February 2013 17:57] Report message to a moderator
|
|
|
Re: Multiple Respawns Causes Bug [message #479264 is a reply to message #479262] |
Tue, 12 February 2013 18:21 |
|
Whitedragon
Messages: 832 Registered: February 2003 Location: California
Karma: 1
|
Colonel |
|
|
The null model is most likely your problem. The game isn't able to check if the player would become stuck by using that spawner.
Black-Cell.net
Network Administrator (2003 - )
DragonServ, Renegade's first IRC interface bot
Creator and lead coder (2002 - )
Dragonade, Renegade's first server side modification
Lead coder (2005 - )
|
|
|
Re: Multiple Respawns Causes Bug [message #479266 is a reply to message #479264] |
Wed, 13 February 2013 02:08 |
|
EvilWhiteDragon
Messages: 3751 Registered: October 2005 Location: The Netherlands
Karma: 0
|
General (3 Stars) |
|
|
Whitedragon wrote on Wed, 13 February 2013 02:21 | The null model is most likely your problem. The game isn't able to check if the player would become stuck by using that spawner.
|
Sounds likely indeed. Would also explain why it doesn't happen on a stock map and why it fails to detect spawn collisions.
BlackIntel admin/founder/PR dude (not a coder)
Please visit http://www.blackintel.org/
V, V for Vendetta | People should not be afraid of their governments.
Governments should be afraid of their people.
|
[Updated on: Wed, 13 February 2013 02:09] Report message to a moderator
|
|
|
Re: Multiple Respawns Causes Bug [message #479270 is a reply to message #479262] |
Wed, 13 February 2013 05:40 |
Troll King
Messages: 56 Registered: June 2012 Location: Netherlands
Karma: 0
|
Recruit |
|
|
Apparantly I was too tired yesterday to notice that I didn't post my post I wrote so I'll write it again hehe..
I found what the problem was. It's becouse I'm using Disable_All_Collisions BEFORE I kill them. When I kill them and they respawn the disabled collisions is still taken into account somehow.
JonWil says that this is a very old bug and he wouldn't be looking into it right now..
EDIT: model has no effect whatsoever
Also Known As: Neijwiert
[Updated on: Wed, 13 February 2013 05:40] Report message to a moderator
|
|
|
|
|
Re: Multiple Respawns Causes Bug [message #479275 is a reply to message #479262] |
Wed, 13 February 2013 11:23 |
Troll King
Messages: 56 Registered: June 2012 Location: Netherlands
Karma: 0
|
Recruit |
|
|
Thats exactly what I dit by using Commands->Enable_Collisions but it doesn't work. The work-around I came up with is pretty stupid, but it works.
I'm killing the guy twice in a row. So first when it has all collisions disabled and also trying to enable collisions before killing it. Then it respawns fresh and untouched and I kill it again.
EDIT:
Also this fancy editing of object upon spawn causes some netcode bugs aswell.. I'm trying to apply some changes so fast after being created that some don't have effect until I kill them again. (Apparently only happens to other players and only the first spawn in-game). AND NO THIS IS NOT MY CODE'S FAULT. I've put lots of debug text in it and tested it numerous times and it always hits the Set_Delete_Pending and then returns the object create event. BUT IT NEVER EVER KILLS THE OBJECT
EDIT #2: If ur wondering why I'm killing them, it's becouse I'm trying to change their teams my own way and I'm doing it the exact same way as SSGM uses for fore TC the only difference is that I'm doing it in the object created event and not in a script created event. I need to do something else thats why I'm not using the Change_Team engine call..
Also Known As: Neijwiert
[Updated on: Wed, 13 February 2013 11:28] Report message to a moderator
|
|
|
Re: Multiple Respawns Causes Bug [message #479276 is a reply to message #479262] |
Wed, 13 February 2013 11:31 |
Troll King
Messages: 56 Registered: June 2012 Location: Netherlands
Karma: 0
|
Recruit |
|
|
EXACT CODE:
Console_Output("spawning new obj\n");
// Invalid obj, not enabled or not alive.
if(!Enabled || !obj || Commands->Get_Health(obj) <= 0 || !obj->As_SoldierGameObj())
return;
Console_Output("1\n");
cPlayer *PData = Find_Player(Get_Player_ID(obj));
// Somehow the player does not have any WW player data.
if(!PData)
return;
Console_Output("2\n");
bool NewPlayer = false;
TC_Player *Player = Find_TC_Player(obj);
// Player data does not exist yet.
if(!Player)
{
NewPlayer = true;
TC_Player *NewPlayer = new TC_Player(PData->Get_Id());
NewPlayer->Set_Spawns(InitialSpawns);
Players.Add(NewPlayer);
Player = NewPlayer;
}
if(!Player->Has_Collisions_Enabled())
{
Player->Toggle_Collisions_Enabled(true);
Player->Respawn_Me();
return;
}
Console_Output("3\n");
// Invalid team.
int PlayerType = Commands->Get_Player_Type(obj); // Must be done via Commands, becouse elseway we get an access violation.
if(PlayerType != 1 && Player->Get_Spawns() > 0)
{
Commands->Attach_Script(obj, "TC_Change_Team_Fix", "1");
return;
}
Console_Output("4\n");
// Change the spawns if we should.
if(!NewPlayer)
Player->Decrease_Spawns();
if(PlayerType != -2 && Player->Get_Spawns() <= 0)
{
Commands->Attach_Script(obj, "TC_Change_Team_Fix", "-2");
return;
}
Console_Output("5\n");
// Only display a message when we're not in a cinematic.
if(!IsInCinematic)
{
StringClass Str;
// Player still has spawns available.
if(Player->Get_Spawns() > 0)
{
Str.Format("%s, you have %d spawn(s) left!", Get_Player_Name(obj), Player->Get_Spawns());
Send_Message_Player(obj, 0, 255, 0, Str.Peek_Buffer());
}
else
{
Str.Format("%s, you have no spawns left!", Get_Player_Name(obj));
Send_Message_Player(obj, 255, 0, 0, Str.Peek_Buffer());
Send_Message_Player(obj, 255, 0, 0, "You can only respawn if somebody picks up a spawn powerup.");
}
}
else if(CinematicStarted)
{
StringClass Str;
Str.Format("%s, there is currently a cinematic playing, please wait.", Get_Player_Name(obj));
Send_Message_Player(obj, 255, 255, 0, Str.Peek_Buffer());
}
// Check if we should make the screen black
Set_Screen_Fade_Color_Player(obj, 0,0,0,0.1f);
Set_Screen_Fade_Opacity_Player(obj, IsScreenHidden ? 1.0f : 0.0f, 0.1f);
// Check if we should render the player.
bool Render = !IsInCinematic;
if(Player->Get_Spawns() <= 0)
Render = false;
// Default object stuff, doesn't matter if we should render or not.
if(NewPlayer || Player->Is_Marked_As_Leaver())
{
Player->Mark_As_Leaver(false);
Set_Background_Music_Player(obj, BackgroundMusic.Peek_Buffer());
}
Set_Max_Health(obj, Health);
Commands->Set_Health(obj, Health);
Set_Max_Shield_Strength(obj, Shield);
Commands->Set_Shield_Strength(obj, Shield);
Set_Skin(obj, "SkinFlesh");
Commands->Set_Shield_Type(obj, "ShieldKevlar");
Commands->Clear_Weapons(obj);
//////////////////////////////////////////////////////////////////
// Stuff that is dependand on rendering.
Commands->Set_Model(obj, Render ? SpawnModel : "null");
Enable_HUD_Player(obj, Render);
Commands->Set_Is_Visible(obj, Render);
// Check if we should be able to fly.
HumanStateClass::HumanStateType State = obj->As_SoldierGameObj()->Get_State();
if((State == HumanStateClass::DEBUG_FLY && !IsInCinematic && Render) || (State != HumanStateClass::DEBUG_FLY && IsInCinematic) || (State != HumanStateClass::DEBUG_FLY && !Render))
Toggle_Fly_Mode(obj);
if(Render)
{
int WeaponCount = WeaponList.Count();
for(int x = 0; x < WeaponCount; x++)
{
StringClass *CurrentWeapon = WeaponList[x];
if(CurrentWeapon)
Commands->Give_PowerUp(obj, CurrentWeapon->Peek_Buffer(), false);
}
}
else
{
obj->As_SoldierGameObj()->Set_Max_Speed(15.0f);
Commands->Disable_Physical_Collisions(obj);
Player->Toggle_Collisions_Enabled(false);
}
////////////////////////////////////////////////////////////////
// Stuff that should only be toggled when we are in a cinematic.
Commands->Control_Enable(obj, !IsInCinematic);
The script Netcode_Fix is to try to do the teamchange in the script created event instead, but does not appear to work properly aswell
Also Known As: Neijwiert
|
|
|