From 23011d42e64b35022bbcce4ace5e474111c04ac5 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Wed, 15 Apr 2020 12:28:11 +0200 Subject: [PATCH] Unbreak Scientist Hunt's gamerules. --- src/server/scihunt/gamerules.cpp | 236 ++++++++++++++++++++- src/server/scihunt/gamerules.h | 8 + src/server/scihunt/shdata_parse.c | 4 +- src/server/valve/gamerules_multiplayer.cpp | 6 - 4 files changed, 244 insertions(+), 10 deletions(-) diff --git a/src/server/scihunt/gamerules.cpp b/src/server/scihunt/gamerules.cpp index 26bf923d..62edc877 100644 --- a/src/server/scihunt/gamerules.cpp +++ b/src/server/scihunt/gamerules.cpp @@ -14,6 +14,8 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +var int autocvar_sv_playerkeepalive = TRUE; + void SHMultiplayerRules::PlayerSpawn(player pl) { @@ -53,8 +55,240 @@ SHMultiplayerRules::PlayerSpawn(player pl) spot = Spawn_SelectRandom("info_player_deathmatch"); setorigin(pl, spot.origin); pl.angles = spot.angles; + + pl.g_items = ITEM_CROWBAR | ITEM_GLOCK | ITEM_SUIT; + pl.activeweapon = WEAPON_GLOCK; + pl.glock_mag = 18; + pl.ammo_9mm = 44; Weapons_RefreshAmmo(pl); - SHData_GetItems(); + SHData_GetItems(pl); Client_FixAngle(pl, pl.angles); } + +void +SHMultiplayerRules::LevelDecodeParms(player pl) +{ + g_landmarkpos[0] = parm1; + g_landmarkpos[1] = parm2; + g_landmarkpos[2] = parm3; + pl.angles[0] = parm4; + pl.angles[1] = parm5; + pl.angles[2] = parm6; + pl.velocity[0] = parm7; + pl.velocity[1] = parm8; + pl.velocity[2] = parm9; + pl.g_items = parm10; + pl.activeweapon = parm11; + pl.flags = parm64; + + pl.ammo_9mm = parm12; + pl.ammo_357 = parm13; + pl.ammo_buckshot = parm14; + pl.ammo_m203_grenade = parm15; + pl.ammo_bolt = parm16; + pl.ammo_rocket = parm17; + pl.ammo_uranium = parm18; + pl.ammo_handgrenade = parm19; + pl.ammo_satchel = parm20; + pl.ammo_tripmine = parm21; + pl.ammo_snark = parm22; + pl.ammo_hornet = parm23; + + pl.glock_mag = parm24; + pl.mp5_mag = parm25; + pl.python_mag = parm26; + pl.shotgun_mag = parm27; + pl.crossbow_mag = parm28; + pl.rpg_mag = parm29; + pl.satchel_chg = parm30; + + if (pl.flags & FL_CROUCHING) { + setsize(pl, VEC_CHULL_MIN, VEC_CHULL_MAX); + } else { + setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX); + } +} + +void +SHMultiplayerRules::LevelChangeParms(player pl) +{ + parm1 = g_landmarkpos[0]; + parm2 = g_landmarkpos[1]; + parm3 = g_landmarkpos[2]; + parm4 = pl.angles[0]; + parm5 = pl.angles[1]; + parm6 = pl.angles[2]; + parm7 = pl.velocity[0]; + parm8 = pl.velocity[1]; + parm9 = pl.velocity[2]; + parm64 = pl.flags; + parm10 = pl.g_items; + parm11 = pl.activeweapon; + parm12 = pl.ammo_9mm; + parm13 = pl.ammo_357; + parm14 = pl.ammo_buckshot; + parm15 = pl.ammo_m203_grenade; + parm16 = pl.ammo_bolt; + parm17 = pl.ammo_rocket; + parm18 = pl.ammo_uranium; + parm19 = pl.ammo_handgrenade; + parm20 = pl.ammo_satchel; + parm21 = pl.ammo_tripmine; + parm22 = pl.ammo_snark; + parm23 = pl.ammo_hornet; + parm24 = pl.glock_mag; + parm25 = pl.mp5_mag; + parm26 = pl.python_mag; + parm27 = pl.shotgun_mag; + parm28 = pl.crossbow_mag; + parm29 = pl.rpg_mag; + parm30 = pl.satchel_chg; +} + +void +SHMultiplayerRules::LevelNewParms(void) +{ + parm1 = parm2 = parm3 = parm4 = parm5 = parm6 = parm7 = + parm8 = parm9 = parm10 = parm11 = parm12 = parm13 = parm14 = + parm15 = parm16 = parm17 = parm18 = parm19 = parm20 = parm21 = + parm22 = parm23 = parm24 = parm25 = parm26 = parm27 = parm28 = + parm29 = parm30 = 0; + parm64 = FL_CLIENT; +} + +/* we check what fields have changed over the course of the frame and network + * only the ones that have actually changed */ +void +SHMultiplayerRules::PlayerPostFrame(player pl) +{ + Animation_PlayerUpdate(); + + if (autocvar_sv_playerkeepalive) + pl.SendFlags |= PLAYER_KEEPALIVE; + + if (pl.old_modelindex != pl.modelindex) + pl.SendFlags |= PLAYER_MODELINDEX; + + if (pl.old_origin[0] != pl.origin[0]) + pl.SendFlags |= PLAYER_ORIGIN; + + if (pl.old_origin[1] != pl.origin[1]) + pl.SendFlags |= PLAYER_ORIGIN; + + if (pl.old_origin[2] != pl.origin[2]) + pl.SendFlags |= PLAYER_ORIGIN_Z; + + if (pl.old_angles[0] != pl.v_angle[0]) + pl.SendFlags |= PLAYER_ANGLES_X; + + if (pl.old_angles[1] != pl.angles[1]) + pl.SendFlags |= PLAYER_ANGLES_Y; + + if (pl.old_angles[2] != pl.angles[2]) + pl.SendFlags |= PLAYER_ANGLES_Z; + + if (pl.old_velocity[0] != pl.velocity[0]) + pl.SendFlags |= PLAYER_VELOCITY; + + if (pl.old_velocity[1] != pl.velocity[1]) + pl.SendFlags |= PLAYER_VELOCITY; + + if (pl.old_velocity[2] != pl.velocity[2]) + pl.SendFlags |= PLAYER_VELOCITY_Z; + + if (pl.old_flags != pl.flags) + pl.SendFlags |= PLAYER_FLAGS; + + if (pl.old_activeweapon != pl.activeweapon) + pl.SendFlags |= PLAYER_WEAPON; + + if (pl.old_items != pl.g_items) + pl.SendFlags |= PLAYER_ITEMS; + + if (pl.old_health != pl.health) + pl.SendFlags |= PLAYER_HEALTH; + + if (pl.old_armor != pl.armor) + pl.SendFlags |= PLAYER_ARMOR; + + if (pl.old_movetype != pl.movetype) + pl.SendFlags |= PLAYER_MOVETYPE; + + if (pl.old_viewofs != pl.view_ofs[2]) + pl.SendFlags |= PLAYER_VIEWOFS; + + if (pl.old_baseframe != pl.baseframe) + pl.SendFlags |= PLAYER_BASEFRAME; + + if (pl.old_frame != pl.frame) + pl.SendFlags |= PLAYER_FRAME; + + if (pl.old_a_ammo1 != pl.a_ammo1) + pl.SendFlags |= PLAYER_AMMO1; + + if (pl.old_a_ammo2 != pl.a_ammo2) + pl.SendFlags |= PLAYER_AMMO2; + + if (pl.old_a_ammo3 != pl.a_ammo3) + pl.SendFlags |= PLAYER_AMMO3; + + pl.old_modelindex = pl.modelindex; + pl.old_origin = pl.origin; + pl.old_angles = pl.angles; + pl.old_angles[0] = pl.v_angle[0]; + pl.old_velocity = pl.velocity; + pl.old_flags = pl.flags; + pl.old_activeweapon = pl.activeweapon; + pl.old_items = pl.g_items; + pl.old_health = pl.health; + pl.old_armor = pl.armor; + pl.old_movetype = pl.movetype; + pl.old_viewofs = pl.view_ofs[2]; + pl.old_baseframe = pl.baseframe; + pl.old_frame = pl.frame; + pl.old_a_ammo1 = pl.a_ammo1; + pl.old_a_ammo2 = pl.a_ammo2; + pl.old_a_ammo3 = pl.a_ammo3; +} + +void +SHMultiplayerRules::PlayerConnect(entity pl) +{ + entity a; + bprint(PRINT_HIGH, sprintf("%s connected\n", pl.netname)); + + int playercount = 0; + for (a = world; (a = find(a, ::classname, "player"));) { + playercount++; + } + + /* we're the first. respawn all entities? */ + if (playercount == 0) { + for (a = world; (a = findfloat(a, ::gflags, GF_CANRESPAWN));) { + CBaseEntity caw = (CBaseEntity)a; + caw.Respawn(); + } + Nodes_Init(); + } +} + +void +SHMultiplayerRules::PlayerDisconnect(entity pl) +{ + bprint(PRINT_HIGH, sprintf("%s disconnected\n", pl.netname)); + + /* Make this unusable */ + pl.solid = SOLID_NOT; + pl.movetype = MOVETYPE_NONE; + pl.modelindex = 0; + pl.health = 0; + pl.takedamage = 0; + pl.SendFlags = PLAYER_MODELINDEX; +} + +void +SHMultiplayerRules::PlayerKill(player pl) +{ + Damage_Apply(pl, pl, pl.health, WEAPON_NONE, DMG_SKIP_ARMOR); +} diff --git a/src/server/scihunt/gamerules.h b/src/server/scihunt/gamerules.h index 08df62e3..a856ba9d 100644 --- a/src/server/scihunt/gamerules.h +++ b/src/server/scihunt/gamerules.h @@ -20,4 +20,12 @@ class SHMultiplayerRules:CGameRules { /* client */ virtual void(player) PlayerSpawn; + virtual void(entity) PlayerConnect; + virtual void(entity) PlayerDisconnect; + virtual void(player) PlayerKill; + virtual void(player) PlayerPostFrame; + + virtual void(player) LevelDecodeParms; + virtual void(player) LevelChangeParms; + virtual void(void) LevelNewParms; }; diff --git a/src/server/scihunt/shdata_parse.c b/src/server/scihunt/shdata_parse.c index 286fe639..63a3aac6 100644 --- a/src/server/scihunt/shdata_parse.c +++ b/src/server/scihunt/shdata_parse.c @@ -84,10 +84,8 @@ void SHData_NewAngles(void) self = oldself; } -void SHData_GetItems(void) +void SHData_GetItems(player pl) { - player pl = (player)self; - /* TODO: Parse the config files */ pl.ammo_9mm = 68; pl.ammo_buckshot = 34; diff --git a/src/server/valve/gamerules_multiplayer.cpp b/src/server/valve/gamerules_multiplayer.cpp index 83dc66f8..1c1cfb31 100644 --- a/src/server/valve/gamerules_multiplayer.cpp +++ b/src/server/valve/gamerules_multiplayer.cpp @@ -14,12 +14,6 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -class HLMultiplayerRules:HLGameRules -{ - /* client */ - virtual void(player) PlayerSpawn; -}; - void HLMultiplayerRules::PlayerSpawn(player pl) {