diff --git a/README.md b/README.md
index bafc5033..1d959aac 100644
--- a/README.md
+++ b/README.md
@@ -28,10 +28,15 @@ Archive's bin directory contains 2 subdirectories, 'bugfixed' and 'pure'
| mp_nadedrops | 0 | 0 | 2 | Drop a grenade after player death
`0` disabled
`1` drop one the grenade
`2` drop a everyone grenades |
| mp_roundrespawn_time | 20 | 0 | - | Player cannot respawn until next round if more than N seconds has elapsed since the beginning round |
| mp_auto_reload_weapons | 0 | 0 | 1 | Automatically reload each weapon on player spawn
`0` disabled
`1` enabled |
-| mp_refill_bpammo_weapons | 0 | 0 | 2 | Refill amount of backpack ammo up to the max
`0` disabled
`1` refill backpack ammo on player spawn
`2` refill backpack ammo on each weapon reload |
-| bot_deathmatch | 0 | 0 | 1 | Set's the mode for the zBot
`0` disabled
`1` enable mode Deathmatch and not allow to do the scenario |
+| mp_refill_bpammo_weapons | 0 | 0 | 2 | Refill amount of backpack ammo up to the max
`0` disabled
`1` refill backpack ammo on player spawn
`2` refill backpack ammo on each weapon reload |
| mp_auto_join_team | 0 | 0 | 1 | Automatically joins the team
`0` disabled
`1` enable (Use in conjunction with the cvar humans_join_team any/CT/T) |
| mp_max_teamkills | 3 | 0 | - | Maximum number of allowed teamkills before autokick. Used when enabled mp_autokick. |
+| mp_fragsleft | - | - | - | Is the number of frags left, if you have set mp_fraglimit. You just type mp_fragsleft in server console, and it tells you the number of frags left depending of mp_fraglimit. |
+| mp_fraglimit | 0 | - | - | If set to something other than 0, when anybody’s scored reaches mp_fraglimit the server changes map.
`0` means no limit |
+| mp_timeleft | - | - | - | Is the number of time left before the map changes, if you have set mp_timelimit. You just type mp_timeleft in server console, and it tells you the number of time left depending of mp_timelimit. |
+| mp_timelimit | 0 | - | - | Period between map rotations.
`0` means no limit |
+| showtriggers | 0 | 0 | 1 | Debug cvar shows triggers. |
+| bot_deathmatch | 0 | 0 | 1 | Set's the mode for the zBot
`0` disabled
`1` enable mode Deathmatch and not allow to do the scenario |
## How to install zBot for CS 1.6?
* Extract all the files from an [archive](regamedll/extra/zBot/bot_profiles.zip?raw=true)
diff --git a/dist/game.cfg b/dist/game.cfg
index c1be303b..ef446f91 100644
--- a/dist/game.cfg
+++ b/dist/game.cfg
@@ -84,3 +84,22 @@ mp_auto_join_team 0
//
// Default value: "3"
mp_max_teamkills 3
+
+// If set to something other than 0,
+// when anybody’s scored reaches mp_fraglimit the server changes map.
+// 0 - means no limit
+//
+// Default value: "0"
+mp_fraglimit 0
+
+// Period between map rotations.
+// 0 - means no limit
+//
+// Default value: "0"
+mp_timelimit 20
+
+// Debug cvar shows triggers.
+// 0 - disabled
+//
+// Default value: "0"
+showtriggers 0
diff --git a/regamedll/dlls/animation.cpp b/regamedll/dlls/animation.cpp
index 12a70a08..b8100b41 100644
--- a/regamedll/dlls/animation.cpp
+++ b/regamedll/dlls/animation.cpp
@@ -359,12 +359,7 @@ float SetController(void *pmodel, entvars_t *pev, int iController, float flValue
}
int setting = int64(255.0f * (flValue - pbonecontroller->start) / (pbonecontroller->end - pbonecontroller->start));
-
- if (setting < 0)
- setting = 0;
-
- if (setting > 255)
- setting = 255;
+ setting = Q_clamp(setting, 0, 255);
pev->controller[ iController ] = setting;
@@ -408,12 +403,7 @@ float SetBlending(void *pmodel, entvars_t *pev, int iBlender, float flValue)
}
int setting = int64(255.0f * (flValue - pseqdesc->blendstart[iBlender]) / (pseqdesc->blendend[iBlender] - pseqdesc->blendstart[iBlender]));
-
- if (setting < 0)
- setting = 0;
-
- if (setting > 255)
- setting = 255;
+ setting = Q_clamp(setting, 0, 255);
pev->blending[iBlender] = setting;
@@ -751,13 +741,7 @@ void StudioCalcBoneAdj(float dadt, float *adj, const byte *pcontroller1, const b
else
{
value = (pcontroller1[i] * dadt + pcontroller2[i] * (1.0 - dadt)) / 255.0;
-
- if (value < 0)
- value = 0;
-
- if (value > 1.0)
- value = 1.0;
-
+ value = Q_clamp(value, 0.0f, 1.0f);
value = (1.0 - value) * pbonecontroller[j].start + value * pbonecontroller[j].end;
}
}
@@ -797,7 +781,7 @@ void StudioCalcBoneQuaterion(int frame, float s, mstudiobone_t *pbone, mstudioan
{
if (panim->offset[j + 3] == 0)
{
- // default;
+ // default
angle2[j] = angle1[j] = pbone->value[j + 3];
}
else
@@ -894,6 +878,7 @@ void StudioCalcBonePosition(int frame, float s, mstudiobone_t *pbone, mstudioani
if (panimvalue->num.total < panimvalue->num.valid)
k = 0;
}
+
// if we're inside the span
if (panimvalue->num.valid > k)
{
@@ -913,6 +898,7 @@ void StudioCalcBonePosition(int frame, float s, mstudiobone_t *pbone, mstudioani
pos[j] += panimvalue[panimvalue->num.valid].value * pbone->scale[j];
}
}
+
if (pbone->bonecontroller[j] != -1 && adj)
{
pos[j] += adj[pbone->bonecontroller[j]];
@@ -926,13 +912,8 @@ void StudioSlerpBones(vec4_t *q1, float pos1[][3], vec4_t *q2, float pos2[][3],
vec4_t q3;
float s1;
- if (s < 0)
- s = 0;
-
- else if (s > 1.0)
- s = 1.0;
-
- s1 = 1.0 - s;
+ s = Q_clamp(s, 0.0f, 1.0f);
+ s1 = 1.0f - s;
for (i = 0; i < g_pstudiohdr->numbones; ++i)
{
@@ -958,8 +939,8 @@ void StudioCalcRotations(mstudiobone_t *pbones, int *chain, int chainlength, flo
{
j = chain[i];
- StudioCalcBoneQuaterion(int(f), s, &pbones[j], &panim[j], adj, q[j]);
- StudioCalcBonePosition(int(f), s, &pbones[j], &panim[j], adj, pos[j]);
+ StudioCalcBoneQuaterion((int)f, s, &pbones[j], &panim[j], adj, q[j]);
+ StudioCalcBonePosition((int)f, s, &pbones[j], &panim[j], adj, pos[j]);
}
}
@@ -991,16 +972,16 @@ float_precision StudioEstimateFrame(float frame, mstudioseqdesc_t *pseqdesc)
void SV_StudioSetupBones(model_t *pModel, float frame, int sequence, const vec_t *angles, const vec_t *origin, const byte *pcontroller, const byte *pblending, int iBone, const edict_t *pEdict)
{
- int i, j;
- float_precision f;
+ int i, j, chainlength = 0;
+ int chain[MAXSTUDIOBONES];
+ double f;
+
float subframe;
float adj[MAXSTUDIOCONTROLLERS];
mstudiobone_t *pbones;
mstudioseqdesc_t *pseqdesc;
mstudioanim_t *panim;
float bonematrix[3][4];
- int chain[MAXSTUDIOBONES];
- int chainlength;
vec3_t temp_angles;
/*static */float pos[MAXSTUDIOBONES][3], pos2[MAXSTUDIOBONES][3];
@@ -1028,8 +1009,7 @@ void SV_StudioSetupBones(model_t *pModel, float frame, int sequence, const vec_t
}
else
{
- chainlength = 0;
-
+ // only the parent bones
for (i = iBone; i != -1; i = pbones[i].parent)
chain[chainlength++] = i;
}
@@ -1047,7 +1027,6 @@ void SV_StudioSetupBones(model_t *pModel, float frame, int sequence, const vec_t
{
float b = float_precision(pblending[0]) / 255.0f;
- pseqdesc = (mstudioseqdesc_t *)((byte *)g_pstudiohdr + g_pstudiohdr->seqindex) + sequence;
panim = StudioGetAnim(pModel, pseqdesc);
panim += g_pstudiohdr->numbones;
@@ -1154,7 +1133,7 @@ void SV_StudioSetupBones(model_t *pModel, float frame, int sequence, const vec_t
if (pseqdesc->numblends == 9 && sequence < ANIM_FIRST_DEATH_SEQUENCE && sequence != ANIM_SWIM_1 && sequence != ANIM_SWIM_2)
{
- int copy = 1;
+ bool bCopy = true;
int gaitsequence = GetPlayerGaitsequence(pEdict); // calc gait animation
if (gaitsequence < 0 || gaitsequence >= g_pstudiohdr->numseq)
@@ -1169,14 +1148,14 @@ void SV_StudioSetupBones(model_t *pModel, float frame, int sequence, const vec_t
{
if (!Q_strcmp(pbones[i].name, "Bip01 Spine"))
{
- copy = 0;
+ bCopy = 0;
}
else if (!Q_strcmp(pbones[pbones[i].parent].name, "Bip01 Pelvis"))
{
- copy = 1;
+ bCopy = 1;
}
- if (copy)
+ if (bCopy)
{
Q_memcpy(pos[i], pos2[i], sizeof(pos[i]));
Q_memcpy(q[i], q2[i], sizeof(q[i]));
@@ -1187,9 +1166,9 @@ void SV_StudioSetupBones(model_t *pModel, float frame, int sequence, const vec_t
VectorCopy(angles, temp_angles);
#ifndef REGAMEDLL_FIXES
- if (pEdict != NULL)
+ if (pEdict)
#else
- if (pEdict != NULL && CBaseEntity::Instance(const_cast(pEdict))->IsPlayer())
+ if (pEdict && CBaseEntity::Instance(const_cast(pEdict))->IsPlayer())
#endif
{
temp_angles[1] = UTIL_GetPlayerGaitYaw(ENTINDEX(pEdict));
diff --git a/regamedll/dlls/bot/cs_bot.h b/regamedll/dlls/bot/cs_bot.h
index 150ef72c..3c51d8a8 100644
--- a/regamedll/dlls/bot/cs_bot.h
+++ b/regamedll/dlls/bot/cs_bot.h
@@ -1871,7 +1871,7 @@ public:
void InstallBotControl();
void Bot_ServerCommand();
-void Bot_RegisterCvars();
+void Bot_RegisterCVars();
int GetBotFollowCount(CBasePlayer *leader);
const Vector *FindNearbyRetreatSpot(CCSBot *me, float maxRange);
diff --git a/regamedll/dlls/bot/cs_bot_chatter.h b/regamedll/dlls/bot/cs_bot_chatter.h
index 3eab9bd4..6cf337da 100644
--- a/regamedll/dlls/bot/cs_bot_chatter.h
+++ b/regamedll/dlls/bot/cs_bot_chatter.h
@@ -49,6 +49,8 @@ class BotMeme
{
public:
void Transmit(CCSBot *sender) const; // transmit meme to other bots
+
+ virtual ~BotMeme(){}
virtual void Interpret(CCSBot *sender, CCSBot *receiver) const = 0; // cause the given bot to act on this meme
};
diff --git a/regamedll/dlls/bot/cs_bot_event.cpp b/regamedll/dlls/bot/cs_bot_event.cpp
index 85902ea5..6a069271 100644
--- a/regamedll/dlls/bot/cs_bot_event.cpp
+++ b/regamedll/dlls/bot/cs_bot_event.cpp
@@ -269,7 +269,7 @@ void CCSBot::__MAKE_VHOOK(OnEvent)(GameEventType event, CBaseEntity *entity, CBa
Run();
m_goalEntity = entity;
- MoveTo(&entity->pev->origin, (RouteType)(m_hostageEscortCount == 0));
+ MoveTo(&entity->pev->origin, m_hostageEscortCount == 0 ? SAFEST_ROUTE : FASTEST_ROUTE);
PrintIfWatched("I'm fetching a hostage that called out to me\n");
return;
diff --git a/regamedll/dlls/bot/cs_bot_init.cpp b/regamedll/dlls/bot/cs_bot_init.cpp
index 41b68609..f817fdf3 100644
--- a/regamedll/dlls/bot/cs_bot_init.cpp
+++ b/regamedll/dlls/bot/cs_bot_init.cpp
@@ -61,7 +61,7 @@ void Bot_ServerCommand()
}
}
-void Bot_RegisterCvars()
+void Bot_RegisterCVars()
{
if (!AreBotsAllowed())
return;
diff --git a/regamedll/dlls/bot/cs_bot_manager.cpp b/regamedll/dlls/bot/cs_bot_manager.cpp
index ef08496a..f21cfd3e 100644
--- a/regamedll/dlls/bot/cs_bot_manager.cpp
+++ b/regamedll/dlls/bot/cs_bot_manager.cpp
@@ -776,9 +776,6 @@ bool CCSBotManager::BotAddCommand(BotProfileTeamType team, bool isFromConsole)
if (IMPL(m_isLearningMap))
return false;
- if (!AreBotsAllowed())
- return false;
-
const BotProfile *profile = NULL;
if (!isFromConsole || CMD_ARGC() < 2)
@@ -848,8 +845,10 @@ bool CCSBotManager::BotAddCommand(BotProfileTeamType team, bool isFromConsole)
// Keep a minimum quota of bots in the game
void CCSBotManager::MaintainBotQuota()
{
+#ifdef REGAMEDLL_FIXES
if (!AreBotsAllowed())
return;
+#endif
if (IMPL(m_isLearningMap))
return;
@@ -887,7 +886,14 @@ void CCSBotManager::MaintainBotQuota()
{
// don't try to add a bot if all teams are full
if (!CSGameRules()->TeamFull(TERRORIST) || !CSGameRules()->TeamFull(CT))
- BotAddCommand(BOT_TEAM_ANY);
+ {
+#ifndef REGAMEDLL_FIXES
+ if (AreBotsAllowed())
+#endif
+ {
+ BotAddCommand(BOT_TEAM_ANY);
+ }
+ }
}
else if (desiredBotCount < botsInGame)
{
diff --git a/regamedll/dlls/bot/cs_bot_statemachine.cpp b/regamedll/dlls/bot/cs_bot_statemachine.cpp
index 5dfaeaed..8b9a4a1e 100644
--- a/regamedll/dlls/bot/cs_bot_statemachine.cpp
+++ b/regamedll/dlls/bot/cs_bot_statemachine.cpp
@@ -267,12 +267,20 @@ void CCSBot::Attack(CBasePlayer *victim)
if (IsAttacking())
return;
+ // if we are currently hiding, increase our chances of crouching and holding position
if (IsAtHidingSpot())
m_attackState.SetCrouchAndHold((RANDOM_FLOAT(0, 100) < 60.0f) != 0);
else
m_attackState.SetCrouchAndHold(false);
- PrintIfWatched("ATTACK BEGIN (reaction time = %g (+ update time), surprise time = %g, attack delay = %g)\n");
+ PrintIfWatched("ATTACK BEGIN (reaction time = %g (+ update time), surprise time = %g, attack delay = %g)\n"
+
+#ifdef REGAMEDLL_FIXES
+ , GetProfile()->GetReactionTime(), m_surpriseDelay, GetProfile()->GetAttackDelay()
+#endif
+
+ );
+
m_isAttacking = true;
m_attackState.OnEnter(this);
diff --git a/regamedll/dlls/client.cpp b/regamedll/dlls/client.cpp
index c313e4cb..b3b93343 100644
--- a/regamedll/dlls/client.cpp
+++ b/regamedll/dlls/client.cpp
@@ -5,8 +5,6 @@
*/
#ifndef HOOK_GAMEDLL
-float g_flTimeLimit = 0;
-float g_flResetTime = 0;
bool g_bClientPrintEnable = true;
char *sPlayerModelFiles[] =
@@ -57,10 +55,9 @@ static entity_field_alias_t custom_entity_field_alias[] =
{ "animtime", 0 },
};
-bool g_bServerActive = false;
-
#endif // HOOK_GAMEDLL
+bool g_bServerActive = false;
PLAYERPVSSTATUS g_PVSStatus[MAX_CLIENTS];
unsigned short m_usResetDecals;
unsigned short g_iShadowSprite;
@@ -991,7 +988,7 @@ void BuyItem(CBasePlayer *pPlayer, int iSlot)
return;
}
- int fullArmor = (pPlayer->pev->armorvalue >= 100);
+ bool bFullArmor = (pPlayer->pev->armorvalue >= 100);
bool bHasHelmet = (pPlayer->m_iKevlar == ARMOR_VESTHELM);
bool bEnoughMoney = false;
@@ -1003,7 +1000,7 @@ void BuyItem(CBasePlayer *pPlayer, int iSlot)
if (pPlayer->HasRestrictItem(ITEM_KEVLAR, ITEM_TYPE_BUYING))
return;
#endif
- if (fullArmor)
+ if (bFullArmor)
{
if (g_bClientPrintEnable)
{
@@ -1032,7 +1029,7 @@ void BuyItem(CBasePlayer *pPlayer, int iSlot)
if (pPlayer->HasRestrictItem(ITEM_ASSAULT, ITEM_TYPE_BUYING))
return;
#endif
- if (fullArmor)
+ if (bFullArmor)
{
if (bHasHelmet)
{
@@ -2090,9 +2087,9 @@ BOOL HandleBuyAliasCommands(CBasePlayer *pPlayer, const char *pszCommand)
WeaponIdType weaponID = WEAPON_NONE;
const char *weaponFailName = BuyAliasToWeaponID(pszCommand, weaponID);
+ // Ok, we have weapon info ID.
if (weaponID != WEAPON_NONE)
{
- // Ok, we have weapon info ID.
// assasination maps have a specific set of weapons that can be used in them.
if (CanBuyWeaponByMaptype(pPlayer->m_iTeam, weaponID, (CSGameRules()->m_iMapHasVIPSafetyZone == MAP_HAVE_VIP_SAFETYZONE_YES)))
{
@@ -2464,15 +2461,15 @@ void EXT_FUNC ClientCommand(edict_t *pEntity)
{
if (gpGlobals->time > player->m_iTimeCheckAllowed)
{
- player->m_iTimeCheckAllowed = int(gpGlobals->time + 1);
+ player->m_iTimeCheckAllowed = int(gpGlobals->time + 1.0f);
if (!timelimit.value)
{
ClientPrint(player->pev, HUD_PRINTTALK, "#Game_no_timelimit");
return;
}
-
- int iTimeRemaining = int(g_flTimeLimit - gpGlobals->time);
+#ifndef REGAMEDLL_FIXES
+ int iTimeRemaining = (int)CSGameRules()->GetTimeLeft();
if (iTimeRemaining < 0)
iTimeRemaining = 0;
@@ -2497,6 +2494,10 @@ void EXT_FUNC ClientCommand(edict_t *pEntity)
}
ClientPrint(player->pev, HUD_PRINTTALK, "#Game_timelimit", UTIL_dtos1(iSeconds), secs);
+#else
+ int timeRemaining = (int)(timelimit.value ? CSGameRules()->GetTimeLeft() : 0);
+ ClientPrint(player->pev, HUD_PRINTTALK, "#Game_timelimit", UTIL_dtos1(timeRemaining / 60), UTIL_dtos2(timeRemaining % 60));
+#endif
}
}
else if (FStrEq(pcmd, "listplayers"))
@@ -3338,6 +3339,7 @@ void EXT_FUNC ServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
#ifdef REGAMEDLL_ADD
CSGameRules()->ServerActivate();
#endif
+
}
void EXT_FUNC PlayerPreThink(edict_t *pEntity)
diff --git a/regamedll/dlls/client.h b/regamedll/dlls/client.h
index df7b6757..c2dabca4 100644
--- a/regamedll/dlls/client.h
+++ b/regamedll/dlls/client.h
@@ -101,13 +101,10 @@ struct entity_field_alias_t
int field;
};
-C_DLLEXPORT float g_flTimeLimit;
C_DLLEXPORT int CountTeams();
C_DLLEXPORT int CountTeamPlayers(int iTeam);
extern bool g_bServerActive;
-
-extern float g_flResetTime;
extern bool g_skipCareerInitialSpawn;
extern unsigned short m_usResetDecals;
diff --git a/regamedll/dlls/combat.cpp b/regamedll/dlls/combat.cpp
index f53324b0..14af3237 100644
--- a/regamedll/dlls/combat.cpp
+++ b/regamedll/dlls/combat.cpp
@@ -1034,15 +1034,21 @@ float GetAmountOfPlayerVisible(Vector vecSrc, CBaseEntity *entity)
{
float retval = 0.0f;
TraceResult tr;
- Vector spot;
const float topOfHead = 25.0f;
const float standFeet = 34.0f;
const float crouchFeet = 14.0f;
const float edgeOffset = 13.0f;
+ const float damagePercentageChest = 0.40f;
+ const float damagePercentageHead = 0.20f;
+ const float damagePercentageFeet = 0.20f;
+ const float damagePercentageRightSide = 0.10f;
+ const float damagePercentageLeftSide = 0.10f;
+
if (!entity->IsPlayer())
{
+ // the entity is not a player, so the damage is all or nothing.
UTIL_TraceLine(vecSrc, entity->pev->origin, ignore_monsters, NULL, &tr);
if (tr.flFraction == 1.0f)
@@ -1051,46 +1057,47 @@ float GetAmountOfPlayerVisible(Vector vecSrc, CBaseEntity *entity)
return retval;
}
- UTIL_TraceLine(vecSrc, entity->pev->origin, ignore_monsters, NULL, &tr);
+ // check chest
+ Vector vecChest = entity->pev->origin;
+ UTIL_TraceLine(vecSrc, vecChest, ignore_monsters, NULL, &tr);
if (tr.flFraction == 1.0f)
- retval += 0.4f;
+ retval += damagePercentageChest;
- spot = entity->pev->origin + Vector(0, 0, topOfHead);
- UTIL_TraceLine(vecSrc, spot, ignore_monsters, NULL, &tr);
+ // check top of head
+ Vector vecHead = entity->pev->origin + Vector(0, 0, topOfHead);
+ UTIL_TraceLine(vecSrc, vecHead, ignore_monsters, NULL, &tr);
if (tr.flFraction == 1.0f)
- retval += 0.2f;
+ retval += damagePercentageHead;
- spot = entity->pev->origin;
- if (entity->pev->flags & FL_DUCKING)
- spot.z -= crouchFeet;
- else
- spot.z -= standFeet;
+ // check feet
+ Vector vecFeet = entity->pev->origin;
+ vecFeet.z -= (entity->pev->flags & FL_DUCKING) ? crouchFeet : standFeet;
- UTIL_TraceLine(vecSrc, spot, ignore_monsters, NULL, &tr);
+ UTIL_TraceLine(vecSrc, vecFeet, ignore_monsters, NULL, &tr);
if (tr.flFraction == 1.0f)
- retval += 0.2f;
+ retval += damagePercentageFeet;
Vector2D dir = (entity->pev->origin - vecSrc).Make2D();
dir.NormalizeInPlace();
Vector2D perp(-dir.y * edgeOffset, dir.x * edgeOffset);
+ Vector vecRightSide = entity->pev->origin + Vector(perp.x, perp.y, 0);
+ Vector vecLeftSide = entity->pev->origin - Vector(perp.x, perp.y, 0);
- spot = entity->pev->origin + Vector(perp.x, perp.y, 0);
-
- UTIL_TraceLine(vecSrc, spot, ignore_monsters, NULL, &tr);
+ // check right "edge"
+ UTIL_TraceLine(vecSrc, vecRightSide, ignore_monsters, NULL, &tr);
if (tr.flFraction == 1.0f)
- retval += 0.1;
+ retval += damagePercentageRightSide;
- spot = entity->pev->origin - Vector(perp.x, perp.y, 0);
-
- UTIL_TraceLine(vecSrc, spot, ignore_monsters, NULL, &tr);
+ // check left "edge"
+ UTIL_TraceLine(vecSrc, vecLeftSide, ignore_monsters, NULL, &tr);
if (tr.flFraction == 1.0f)
- retval += 0.1;
+ retval += damagePercentageLeftSide;
return retval;
}
diff --git a/regamedll/dlls/game.cpp b/regamedll/dlls/game.cpp
index 2459feac..a934517e 100644
--- a/regamedll/dlls/game.cpp
+++ b/regamedll/dlls/game.cpp
@@ -16,8 +16,10 @@ cvar_t timelimit = { "mp_timelimit", "0", FCVAR_SERVER, 0.0f, NULL };
cvar_t flashlight = { "mp_flashlight", "0", FCVAR_SERVER, 0.0f, NULL };
cvar_t decalfrequency = { "decalfrequency", "30", FCVAR_SERVER, 0.0f, NULL };
cvar_t fadetoblack = { "mp_fadetoblack", "0", FCVAR_SERVER, 0.0f, NULL };
-cvar_t fragsleft = { "mp_fragsleft", "0", FCVAR_SERVER | FCVAR_UNLOGGED, 0.0f, NULL };
+
+cvar_t fragsleft = { "mp_fragsleft", "0", FCVAR_SERVER | FCVAR_UNLOGGED, 0.0f, NULL }; // Don't spam console/log files/users with this changing
cvar_t timeleft = { "mp_timeleft", "0", FCVAR_SERVER | FCVAR_UNLOGGED, 0.0f, NULL };
+
cvar_t friendlyfire = { "mp_friendlyfire", "0", FCVAR_SERVER, 0.0f, NULL };
cvar_t allowmonsters = { "mp_allowmonsters", "0", FCVAR_SERVER, 0.0f, NULL };
cvar_t roundtime = { "mp_roundtime", "5", FCVAR_SERVER, 0.0f, NULL };
@@ -106,6 +108,10 @@ cvar_t refill_bpammo_weapons = { "mp_refill_bpammo_weapons", "0", 0, 0.0f, nullp
cvar_t freeforall = { "mp_freeforall", "0", FCVAR_SERVER, 0.0f, nullptr };
cvar_t auto_join_team = { "mp_auto_join_team", "0", 0, 0.0f, nullptr };
cvar_t max_teamkills = { "mp_max_teamkills", "3", 0, 3.0f, nullptr };
+cvar_t fraglimit = { "mp_fraglimit", "0", FCVAR_SERVER, 0.0f, nullptr };
+
+cvar_t showtriggers = { "showtriggers", "0", 0, 0.0f, nullptr }; // debug cvar shows triggers
+ // TODO: Maybe it's better to register in the engine?
void GameDLL_Version_f()
{
@@ -238,6 +244,9 @@ void EXT_FUNC GameDLLInit()
CVAR_REGISTER(&freeforall);
CVAR_REGISTER(&auto_join_team);
CVAR_REGISTER(&max_teamkills);
+ CVAR_REGISTER(&fraglimit);
+
+ CVAR_REGISTER(&showtriggers);
// print version
CONSOLE_ECHO("ReGameDLL build: " __TIME__ " " __DATE__ " (" APP_VERSION_STRD ")\n");
@@ -245,7 +254,7 @@ void EXT_FUNC GameDLLInit()
#endif // REGAMEDLL_ADD
- Bot_RegisterCvars();
+ Bot_RegisterCVars();
Tutor_RegisterCVars();
Hostage_RegisterCVars();
}
diff --git a/regamedll/dlls/game.h b/regamedll/dlls/game.h
index e83e0be9..840d190f 100644
--- a/regamedll/dlls/game.h
+++ b/regamedll/dlls/game.h
@@ -143,6 +143,9 @@ extern cvar_t refill_bpammo_weapons;
extern cvar_t freeforall;
extern cvar_t auto_join_team;
extern cvar_t max_teamkills;
+extern cvar_t fraglimit;
+
+extern cvar_t showtriggers;
#endif
diff --git a/regamedll/dlls/gamerules.h b/regamedll/dlls/gamerules.h
index 91df5980..df25be33 100644
--- a/regamedll/dlls/gamerules.h
+++ b/regamedll/dlls/gamerules.h
@@ -347,7 +347,7 @@ public:
#endif
public:
- BOOL m_bFreezePeriod;
+ BOOL m_bFreezePeriod; // TRUE at beginning of round, set to FALSE when the period expires
BOOL m_bBombDropped;
// custom
@@ -702,6 +702,7 @@ public:
// Check various conditions to end the map.
bool CheckGameOver();
bool CheckTimeLimit();
+ bool CheckFragLimit();
bool CheckMaxRounds();
bool CheckWinLimit();
@@ -721,7 +722,9 @@ public:
bool ShouldSkipSpawn() const { return m_bSkipSpawn; }
void MarkSpawnSkipped() { m_bSkipSpawn = false; }
void PlayerJoinedTeam(CBasePlayer *pPlayer) { }
- float TimeRemaining() { return m_iRoundTimeSecs - gpGlobals->time + m_fRoundCount; }
+ float GetRoundRemainingTime() const { return m_iRoundTimeSecs - gpGlobals->time + m_fRoundStartTime; }
+ float GetTimeLeft() const { return m_flTimeLimit - gpGlobals->time; }
+
BOOL TeamFull(int team_id);
BOOL TeamStacked(int newTeam_id, int curTeam_id);
bool IsVIPQueueEmpty();
@@ -750,7 +753,7 @@ public:
VFUNC BOOL IsThereABomb();
VFUNC TeamName SelectDefaultTeam();
- bool IsMatchStarted() { return (m_fTeamCount != 0.0f || m_fCareerRoundMenuTime != 0.0f || m_fCareerMatchMenuTime != 0.0f); }
+ bool IsMatchStarted() { return (m_flRestartRoundTime != 0.0f || m_fCareerRoundMenuTime != 0.0f || m_fCareerMatchMenuTime != 0.0f); }
void SendMOTDToClient(edict_t *client);
void TerminateRound(float tmDelay, int iWinStatus);
@@ -769,9 +772,9 @@ public:
static RewardAccount m_rgRewardAccountRules[];
CVoiceGameMgr m_VoiceGameMgr;
- float m_fTeamCount; // m_flRestartRoundTime, the global time when the round is supposed to end, if this is not 0
+ float m_flRestartRoundTime; // The global time when the round is supposed to end, if this is not 0 (deprecated name m_fTeamCount)
float m_flCheckWinConditions;
- float m_fRoundCount;
+ float m_fRoundStartTime; // Time round has started (deprecated name m_fRoundCount)
int m_iRoundTime; // (From mp_roundtime) - How many seconds long this round is.
int m_iRoundTimeSecs;
int m_iIntroRoundTime; // (From mp_freezetime) - How many seconds long the intro round (when players are frozen) is.
@@ -857,6 +860,8 @@ protected:
bool m_bSkipShowMenu;
bool m_bNeededPlayers;
float m_flEscapeRatio;
+ float m_flTimeLimit;
+ float m_flGameStartTime;
};
typedef struct mapcycle_item_s
@@ -894,15 +899,16 @@ extern CGameRules DLLEXPORT *g_pGameRules;
CGameRules *InstallGameRules();
CGameRules *InstallGameRules_();
+// Gets us at the CS game rules
inline CHalfLifeMultiplay *CSGameRules()
{
- return reinterpret_cast(g_pGameRules);
+ return static_cast(g_pGameRules);
}
inline void CHalfLifeMultiplay::TerminateRound(float tmDelay, int iWinStatus)
{
m_iRoundWinStatus = iWinStatus;
- m_fTeamCount = gpGlobals->time + tmDelay;
+ m_flRestartRoundTime = gpGlobals->time + tmDelay;
m_bRoundTerminating = true;
}
diff --git a/regamedll/dlls/hostage/hostage.cpp b/regamedll/dlls/hostage/hostage.cpp
index 3007d6d0..d12a6e75 100644
--- a/regamedll/dlls/hostage/hostage.cpp
+++ b/regamedll/dlls/hostage/hostage.cpp
@@ -499,7 +499,7 @@ void CHostage::IdleThink()
{
m_vOldPos = pev->origin;
- if (!CSGameRules()->m_fTeamCount)
+ if (!CSGameRules()->m_flRestartRoundTime)
{
SendHostagePositionMsg();
}
@@ -657,7 +657,7 @@ BOOL CHostage::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevA
CSGameRules()->CheckWinConditions();
- if (!CSGameRules()->m_fTeamCount)
+ if (!CSGameRules()->m_flRestartRoundTime)
SendHostageEventMsg();
pev->nextthink = gpGlobals->time + 3.0f;
diff --git a/regamedll/dlls/hostage/hostage.h b/regamedll/dlls/hostage/hostage.h
index 0c3a04bb..2c583d58 100644
--- a/regamedll/dlls/hostage/hostage.h
+++ b/regamedll/dlls/hostage/hostage.h
@@ -152,7 +152,7 @@ public:
return m_improv->IsFollowing();
}
- if (entity == NULL && m_hTargetEnt == NULL || (entity != NULL && m_hTargetEnt != entity))
+ if ((!entity && !m_hTargetEnt) || (entity != NULL && m_hTargetEnt != entity))
return false;
if (m_State != FOLLOW)
diff --git a/regamedll/dlls/hostage/hostage_improv.cpp b/regamedll/dlls/hostage/hostage_improv.cpp
index e65ba68c..d68aa560 100644
--- a/regamedll/dlls/hostage/hostage_improv.cpp
+++ b/regamedll/dlls/hostage/hostage_improv.cpp
@@ -1246,7 +1246,7 @@ void CHostageImprov::__MAKE_VHOOK(OnGameEvent)(GameEventType event, CBaseEntity
{
Frighten(TERRIFIED);
- if (!entity->IsPlayer() || entity->IsPlayer() && ((CBasePlayer *)entity)->m_iTeam != TERRORIST)
+ if (!entity->IsPlayer() || (entity->IsPlayer() && ((CBasePlayer *)entity)->m_iTeam != TERRORIST))
{
DelayedChatter(RANDOM_FLOAT(0.5f, 0.7f), HOSTAGE_CHATTER_SCARED_OF_MURDER, true);
}
diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp
index 7e12f43c..9d336100 100644
--- a/regamedll/dlls/multiplay_gamerules.cpp
+++ b/regamedll/dlls/multiplay_gamerules.cpp
@@ -57,9 +57,9 @@ bool IsBotSpeaking()
void SV_Continue_f()
{
- if (CSGameRules()->IsCareer() && CSGameRules()->m_fTeamCount > 100000.0)
+ if (CSGameRules()->IsCareer() && CSGameRules()->m_flRestartRoundTime > 100000.0)
{
- CSGameRules()->m_fTeamCount = gpGlobals->time;
+ CSGameRules()->m_flRestartRoundTime = gpGlobals->time;
// go continue
MESSAGE_BEGIN(MSG_ALL, gmsgCZCareer);
@@ -414,7 +414,7 @@ CHalfLifeMultiplay::CHalfLifeMultiplay()
m_flIntermissionEndTime = 0;
m_flIntermissionStartTime = 0;
- m_fTeamCount = 0;
+ m_flRestartRoundTime = 0;
m_iAccountCT = 0;
m_iAccountTerrorist = 0;
@@ -542,7 +542,7 @@ CHalfLifeMultiplay::CHalfLifeMultiplay()
}
}
- m_fRoundCount = 0;
+ m_fRoundStartTime = 0;
m_fIntroRoundCount = 0;
#ifndef CSTRIKE
@@ -591,6 +591,8 @@ CHalfLifeMultiplay::CHalfLifeMultiplay()
m_bSkipShowMenu = false;
m_bNeededPlayers = false;
m_flEscapeRatio = 0.0f;
+ m_flTimeLimit = 0.0f;
+ m_flGameStartTime = 0.0f;
#ifndef REGAMEDLL_FIXES
g_pMPGameRules = this;
@@ -1533,11 +1535,7 @@ void CHalfLifeMultiplay::SwapAllPlayers()
}
// Swap Team victories
- int iTemp;
-
- iTemp = m_iNumTerroristWins;
- m_iNumTerroristWins = m_iNumCTWins;
- m_iNumCTWins = iTemp;
+ SWAP(m_iNumTerroristWins, m_iNumCTWins);
// Update the clients team score
UpdateTeamScores();
@@ -1749,11 +1747,11 @@ void CHalfLifeMultiplay::__API_VHOOK(RestartRound)()
CVAR_SET_FLOAT("mp_timelimit", 0);
}
- g_flResetTime = gpGlobals->time;
+ m_flGameStartTime = gpGlobals->time;
// Reset timelimit
if (timelimit.value)
- g_flTimeLimit = gpGlobals->time + (timelimit.value * 60);
+ m_flTimeLimit = gpGlobals->time + (timelimit.value * 60);
// Reset total # of rounds played
m_iTotalRoundsPlayed = 0;
@@ -1924,7 +1922,7 @@ void CHalfLifeMultiplay::__API_VHOOK(RestartRound)()
// Update individual players accounts and respawn players
// the round time stamp must be set before players are spawned
- m_fIntroRoundCount = m_fRoundCount = gpGlobals->time;
+ m_fIntroRoundCount = m_fRoundStartTime = gpGlobals->time;
// Adrian - No cash for anyone at first rounds! ( well, only the default. )
if (m_bCompleteReset)
@@ -2031,7 +2029,7 @@ void CHalfLifeMultiplay::__API_VHOOK(RestartRound)()
// Reset game variables
m_flIntermissionEndTime = 0;
m_flIntermissionStartTime = 0;
- m_fTeamCount = 0.0;
+ m_flRestartRoundTime = 0.0;
m_iAccountTerrorist = m_iAccountCT = 0;
m_iHostagesRescued = 0;
m_iHostagesTouched = 0;
@@ -2353,10 +2351,10 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(Think)()
CVAR_SET_FLOAT("sv_clienttrace", 1);
}
- if (!m_fRoundCount)
+ if (!m_fRoundStartTime)
{
- // intialize the timer time stamps, this happens once only
- m_fIntroRoundCount = m_fRoundCount = gpGlobals->time;
+ // initialize the timer time stamps, this happens once only
+ m_fIntroRoundCount = m_fRoundStartTime = gpGlobals->time;
}
if (m_flForceCameraValue != forcecamera.value
@@ -2382,6 +2380,10 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(Think)()
if (CheckTimeLimit())
return;
+ // did somebody hit the fraglimit ?
+ if (CheckFragLimit())
+ return;
+
if (!IsCareer())
{
// have we hit the max rounds?
@@ -2413,7 +2415,7 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(Think)()
CheckRoundTimeExpired();
}
- if (m_fTeamCount != 0.0f && m_fTeamCount <= gpGlobals->time)
+ if (m_flRestartRoundTime > 0.0f && m_flRestartRoundTime <= gpGlobals->time)
{
if (!IsCareer() || !m_fCareerRoundMenuTime)
{
@@ -2423,7 +2425,7 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(Think)()
{
bool isBotSpeaking = false;
- if (m_fTeamCount + 10.0f > gpGlobals->time)
+ if (m_flRestartRoundTime + 10.0f > gpGlobals->time)
{
isBotSpeaking = IsBotSpeaking();
}
@@ -2480,7 +2482,7 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(Think)()
MESSAGE_END();
pPlayer->m_iHideHUD |= HIDEHUD_ALL;
- m_fTeamCount = gpGlobals->time + 100000.0;
+ m_flRestartRoundTime = gpGlobals->time + 100000.0;
UTIL_LogPrintf("Career Round %d %d %d %d\n", m_iRoundWinStatus, m_iNumCTWins, m_iNumTerroristWins, TheCareerTasks->AreAllTasksComplete());
break;
@@ -2568,6 +2570,7 @@ bool CHalfLifeMultiplay::CheckGameOver()
// someone else quit the game already
if (g_fGameOver)
{
+ // bounds check
int time = int(CVAR_GET_FLOAT("mp_chattime"));
if (time < 1)
@@ -2576,13 +2579,12 @@ bool CHalfLifeMultiplay::CheckGameOver()
else if (time > MAX_INTERMISSION_TIME)
CVAR_SET_STRING("mp_chattime", UTIL_dtos1(MAX_INTERMISSION_TIME));
- // bounds check
m_flIntermissionEndTime = m_flIntermissionStartTime + mp_chattime.value;
// check to see if we should change levels now
if (m_flIntermissionEndTime < gpGlobals->time && !IsCareer())
{
- if (!UTIL_HumansInGame() // if only bots, just change immediately
+ if (!UTIL_HumansInGame() // if only bots, just change immediately
|| m_iEndIntermissionButtonHit // check that someone has pressed a key, or the max intermission time is over
|| ((m_flIntermissionStartTime + MAX_INTERMISSION_TIME) < gpGlobals->time))
{
@@ -2599,9 +2601,7 @@ bool CHalfLifeMultiplay::CheckGameOver()
bool CHalfLifeMultiplay::CheckTimeLimit()
{
- float fTimeLimit = timelimit.value;
-
- if (fTimeLimit < 0)
+ if (timelimit.value < 0)
{
CVAR_SET_FLOAT("mp_timelimit", 0);
return false;
@@ -2609,17 +2609,29 @@ bool CHalfLifeMultiplay::CheckTimeLimit()
if (!IsCareer())
{
- if (fTimeLimit != 0.0f)
+ if (timelimit.value)
{
- g_flTimeLimit = g_flResetTime + fTimeLimit * 60.0f;
+ m_flTimeLimit = m_flGameStartTime + timelimit.value * 60.0f;
+
+ if (gpGlobals->time >= m_flTimeLimit)
+ {
+ ALERT(at_console, "Changing maps because time limit has been met\n");
+ GoToIntermission();
+ return true;
+ }
}
- if (fTimeLimit > 0 && gpGlobals->time >= g_flTimeLimit)
+#ifdef REGAMEDLL_ADD
+ static int lastTime = 0;
+ int timeRemaining = (int)(timelimit.value ? (m_flTimeLimit - gpGlobals->time) : 0);
+
+ // Updates once per second
+ if (timeRemaining != lastTime)
{
- ALERT(at_console, "Changing maps because time limit has been met\n");
- GoToIntermission();
- return true;
+ lastTime = timeRemaining;
+ g_engfuncs.pfnCvar_DirectSet(&timeleft, UTIL_VarArgs("%02d:%02d", timeRemaining / 60, timeRemaining % 60));
}
+#endif
}
return false;
@@ -2653,9 +2665,56 @@ bool CHalfLifeMultiplay::CheckWinLimit()
return false;
}
+bool CHalfLifeMultiplay::CheckFragLimit()
+{
+#ifdef REGAMEDLL_ADD
+ int fragsRemaining = 0;
+
+ if (fraglimit.value)
+ {
+ int bestFrags = fraglimit.value;
+
+ // check if any player is over the frag limit
+ for (int i = 1; i <= gpGlobals->maxClients; i++)
+ {
+ auto pPlayer = UTIL_PlayerByIndex(i);
+
+ if (!pPlayer || pPlayer->has_disconnected)
+ continue;
+
+ if (pPlayer->pev->frags >= fraglimit.value)
+ {
+ ALERT(at_console, "Changing maps because frag limit has been met\n");
+ GoToIntermission();
+ return true;
+ }
+
+ int remain = (int)(fraglimit.value - pPlayer->pev->frags);
+ if (remain < bestFrags)
+ {
+ bestFrags = remain;
+ }
+ }
+
+ fragsRemaining = bestFrags;
+ }
+
+ static int lastFrags = 0;
+
+ // Updates when frags change
+ if (fragsRemaining != lastFrags)
+ {
+ lastFrags = fragsRemaining;
+ g_engfuncs.pfnCvar_DirectSet(&fragsleft, UTIL_VarArgs("%i", fragsRemaining));
+ }
+#endif
+
+ return false;
+}
+
void CHalfLifeMultiplay::CheckFreezePeriodExpired()
{
- if (TimeRemaining() > 0)
+ if (GetRoundRemainingTime() > 0)
return;
// Log this information
@@ -2700,7 +2759,7 @@ void CHalfLifeMultiplay::CheckFreezePeriodExpired()
}
// Reset the round time
- m_fRoundCount = gpGlobals->time;
+ m_fRoundStartTime = gpGlobals->time;
// in seconds
m_iRoundTimeSecs = m_iRoundTime;
@@ -2843,12 +2902,12 @@ void CHalfLifeMultiplay::CheckRoundTimeExpired()
float flEndRoundTime;
// Check to see if there's still a live C4 hanging around.. if so, wait until this C4 blows before ending the round
- CGrenade *C4 = (CGrenade *)UTIL_FindEntityByClassname(NULL, "grenade");
+ CGrenade *pBomb = (CGrenade *)UTIL_FindEntityByClassname(NULL, "grenade");
- if (C4 != NULL)
+ if (pBomb)
{
- if (!C4->m_bJustBlew)
- flEndRoundTime = C4->m_flC4Blow;
+ if (!pBomb->m_bJustBlew)
+ flEndRoundTime = pBomb->m_flC4Blow;
else
flEndRoundTime = gpGlobals->time + 5.0f;
}
@@ -2877,7 +2936,7 @@ void CHalfLifeMultiplay::CheckRoundTimeExpired()
}
// This is done so that the portion of code has enough time to do it's thing.
- m_fRoundCount = gpGlobals->time + 60.0f;
+ m_fRoundStartTime = gpGlobals->time + 60.0f;
}
void CHalfLifeMultiplay::CheckLevelInitialized()
@@ -2927,7 +2986,7 @@ void CHalfLifeMultiplay::CheckRestartRound()
UTIL_ClientPrintAll(HUD_PRINTCENTER, "#Game_will_restart_in", UTIL_dtos1(iRestartDelay), (iRestartDelay == 1) ? "SECOND" : "SECONDS");
UTIL_ClientPrintAll(HUD_PRINTCONSOLE, "#Game_will_restart_in_console", UTIL_dtos1(iRestartDelay), (iRestartDelay == 1) ? "SECOND" : "SECONDS");
- m_fTeamCount = gpGlobals->time + iRestartDelay;
+ m_flRestartRoundTime = gpGlobals->time + iRestartDelay;
m_bCompleteReset = true;
CVAR_SET_FLOAT("sv_restartround", 0);
@@ -2940,7 +2999,7 @@ void CHalfLifeMultiplay::CheckRestartRound()
bool CHalfLifeMultiplay::HasRoundTimeExpired()
{
// We haven't completed other objectives, so go for this!.
- if (TimeRemaining() > 0 || m_iRoundWinStatus != WINNER_NONE)
+ if (GetRoundRemainingTime() > 0 || m_iRoundWinStatus != WINNER_NONE)
{
return false;
}
@@ -3001,9 +3060,9 @@ void CHalfLifeMultiplay::CareerRestart()
{
g_fGameOver = FALSE;
- if (m_fTeamCount == 0.0f)
+ if (m_flRestartRoundTime == 0.0f)
{
- m_fTeamCount = gpGlobals->time + 1.0f;
+ m_flRestartRoundTime = gpGlobals->time + 1.0f;
}
// for reset everything
@@ -3534,7 +3593,7 @@ BOOL CHalfLifeMultiplay::__API_VHOOK(FPlayerCanRespawn)(CBasePlayer *pPlayer)
if (m_iNumTerrorist > 0 && m_iNumCT > 0)
{
- if (gpGlobals->time > m_fRoundCount + GetRoundRespawnTime())
+ if (gpGlobals->time > m_fRoundStartTime + GetRoundRespawnTime())
{
// If this player just connected and fadetoblack is on, then maybe
// the server admin doesn't want him peeking around.
@@ -4599,8 +4658,13 @@ void CHalfLifeMultiplay::__API_VHOOK(ChangeLevel)()
char szRules[1500];
int minplayers = 0, maxplayers = 0;
+#ifdef REGAMEDLL_FIXES
+ // the absolute default level is de_dust
+ Q_strcpy(szFirstMapInList, "de_dust");
+#else
// the absolute default level is hldm1
Q_strcpy(szFirstMapInList, "hldm1");
+#endif
int curplayers;
bool do_cycle = true;
@@ -4821,5 +4885,4 @@ TeamName CHalfLifeMultiplay::SelectDefaultTeam()
}
return team;
-
-}
\ No newline at end of file
+}
diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp
index 2f00ef0a..bb220b1e 100644
--- a/regamedll/dlls/player.cpp
+++ b/regamedll/dlls/player.cpp
@@ -570,7 +570,7 @@ void CBasePlayer::Radio(const char *msg_id, const char *msg_verbose, short pitch
CBasePlayer *pTarget = static_cast(CBaseEntity::Instance(pPlayer->m_hObserverTarget->pev));
- if (pTarget != NULL && pTarget->m_iTeam == m_iTeam)
+ if (pTarget && pTarget->m_iTeam == m_iTeam)
{
bSend = true;
}
@@ -1690,6 +1690,10 @@ void CBasePlayer::RemoveAllItems(BOOL removeSuit)
pev->viewmodel = 0;
pev->weaponmodel = 0;
+#ifdef REGAMEDLL_FIXES
+ m_iHideHUD |= HIDEHUD_WEAPONS;
+#endif
+
if (removeSuit)
pev->weapons = 0;
else
@@ -3231,7 +3235,7 @@ void CBasePlayer::SyncRoundTimer()
float tmRemaining;
if (CSGameRules()->IsMultiplayer())
- tmRemaining = CSGameRules()->TimeRemaining();
+ tmRemaining = CSGameRules()->GetRoundRemainingTime();
else
tmRemaining = 0;
@@ -3260,7 +3264,7 @@ void CBasePlayer::SyncRoundTimer()
if (tmRemaining != 0.0f)
{
- remaining = TheCareerTasks->GetTaskTime() - (gpGlobals->time - CSGameRules()->m_fRoundCount);
+ remaining = TheCareerTasks->GetTaskTime() - (gpGlobals->time - CSGameRules()->m_fRoundStartTime);
}
if (remaining < 0)
@@ -3418,7 +3422,7 @@ void CBasePlayer::JoiningThink()
Spawn();
CSGameRules()->CheckWinConditions();
- if (!CSGameRules()->m_fTeamCount && CSGameRules()->m_bMapHasBombTarget && !CSGameRules()->IsThereABomber() && !CSGameRules()->IsThereABomb())
+ if (!CSGameRules()->m_flRestartRoundTime && CSGameRules()->m_bMapHasBombTarget && !CSGameRules()->IsThereABomber() && !CSGameRules()->IsThereABomb())
{
CSGameRules()->GiveC4();
}
@@ -4179,7 +4183,7 @@ bool CBasePlayer::CanPlayerBuy(bool display)
CVAR_SET_FLOAT("mp_buytime", (MIN_BUY_TIME / 60.0f));
}
- if (gpGlobals->time - CSGameRules()->m_fRoundCount > buyTime)
+ if (gpGlobals->time - CSGameRules()->m_fRoundStartTime > buyTime)
{
if (display)
{
@@ -4630,7 +4634,7 @@ void CBasePlayer::CheckSuitUpdate()
// play a sentence off of the end of the queue
for (i = 0; i < CSUITPLAYLIST; ++i)
{
- if (isentence = m_rgSuitPlayList[ isearch ])
+ if ((isentence = m_rgSuitPlayList[ isearch ]))
break;
if (++isearch == CSUITPLAYLIST)
@@ -6428,6 +6432,9 @@ BOOL CBasePlayer::__API_VHOOK(AddPlayerItem)(CBasePlayerItem *pItem)
SwitchWeapon(pItem);
}
}
+#ifdef REGAMEDLL_FIXES
+ m_iHideHUD &= ~HIDEHUD_WEAPONS;
+#endif
return TRUE;
}
@@ -7432,7 +7439,7 @@ void CBasePlayer::__API_HOOK(DropPlayerItem)(const char *pszItemName)
SetBombIcon(FALSE);
pWeapon->m_pPlayer->SetProgressBarTime(0);
- if (!CSGameRules()->m_fTeamCount)
+ if (!CSGameRules()->m_flRestartRoundTime)
{
UTIL_LogPrintf("\"%s<%i><%s>\" triggered \"Dropped_The_Bomb\"\n", STRING(pev->netname), GETPLAYERUSERID(edict()), GETPLAYERAUTHID(edict()));
g_pGameRules->m_bBombDropped = TRUE;
@@ -7730,7 +7737,7 @@ BOOL CBasePlayer::SwitchWeapon(CBasePlayerItem *pWeapon)
ResetAutoaim();
- if (m_pActiveItem != NULL)
+ if (m_pActiveItem)
{
m_pActiveItem->Holster();
}
@@ -7738,9 +7745,10 @@ BOOL CBasePlayer::SwitchWeapon(CBasePlayerItem *pWeapon)
CBasePlayerItem *pTemp = m_pActiveItem;
m_pActiveItem = pWeapon;
m_pLastItem = pTemp;
+
pWeapon->Deploy();
- if (pWeapon->m_pPlayer != NULL)
+ if (pWeapon->m_pPlayer)
{
pWeapon->m_pPlayer->ResetMaxSpeed();
}
@@ -8191,7 +8199,7 @@ void CBasePlayer::SpawnClientSideCorpse()
m_canSwitchObserverModes = true;
- if (TheTutor != NULL)
+ if (TheTutor)
{
TheTutor->OnEvent(EVENT_CLIENT_CORPSE_SPAWNED, this);
}
@@ -8293,29 +8301,14 @@ bool CBasePlayer::IsLookingAtPosition(Vector *pos, float angleTolerance)
bool CBasePlayer::CanAffordPrimary()
{
- int account = m_iAccount;
+ auto team = (m_iTeam == CT) ? TERRORIST : (m_iTeam == TERRORIST) ? CT : UNASSIGNED;
+ if (team == UNASSIGNED)
+ return false;
- if (m_iTeam == CT)
+ for (auto& weapon : g_weaponStruct)
{
- WeaponStruct *temp;
- for (int i = 0; i < MAX_WEAPONS; ++i)
- {
- temp = &g_weaponStruct[ i ];
-
- if ((temp->m_side & TERRORIST) && temp->m_slot == PRIMARY_WEAPON_SLOT && account >= temp->m_price)
- return true;
- }
- }
- else if (m_iTeam == TERRORIST)
- {
- WeaponStruct *temp;
- for (int i = 0; i < MAX_WEAPONS; ++i)
- {
- temp = &g_weaponStruct[ i ];
-
- if ((temp->m_side & CT) && temp->m_slot == PRIMARY_WEAPON_SLOT && account >= temp->m_price)
- return true;
- }
+ if ((weapon.m_side & team) && weapon.m_slot == PRIMARY_WEAPON_SLOT && m_iAccount >= weapon.m_price)
+ return true;
}
return false;
@@ -8325,11 +8318,9 @@ bool CBasePlayer::CanAffordPrimaryAmmo()
{
CBasePlayerWeapon *primary = static_cast(m_rgpPlayerItems[ PRIMARY_WEAPON_SLOT ]);
- for (int i = 0; i < MAX_WEAPONS; ++i)
+ for (auto& weapon : g_weaponStruct)
{
- WeaponStruct *temp = &g_weaponStruct[ i ];
-
- if (temp->m_type == primary->m_iId && m_iAccount >= temp->m_ammoPrice)
+ if (weapon.m_type == primary->m_iId && m_iAccount >= weapon.m_ammoPrice)
return true;
}
@@ -8340,11 +8331,9 @@ bool CBasePlayer::CanAffordSecondaryAmmo()
{
CBasePlayerWeapon *secondary = static_cast(m_rgpPlayerItems[ PISTOL_SLOT ]);
- for (int i = 0; i < MAX_WEAPONS; ++i)
+ for (auto& weapon : g_weaponStruct)
{
- WeaponStruct *temp = &g_weaponStruct[ i ];
-
- if (temp->m_type == secondary->m_iId && m_iAccount >= temp->m_ammoPrice)
+ if (weapon.m_type == secondary->m_iId && m_iAccount >= weapon.m_ammoPrice)
return true;
}
@@ -8596,9 +8585,10 @@ bool IsSecondaryWeaponId(int id)
const char *GetWeaponAliasFromName(const char *weaponName)
{
- if (!Q_strncmp(weaponName, "weapon_", 7))
+ const char cut_weapon[] = "weapon_";
+ if (!Q_strncmp(weaponName, cut_weapon, sizeof(cut_weapon) - 1))
{
- weaponName += 7;
+ weaponName += sizeof(cut_weapon) - 1;
}
return weaponName;
@@ -8674,11 +8664,7 @@ const char *CBasePlayer::PickPrimaryCareerTaskWeapon()
{
// randomize names weapons of list
int rand = RANDOM_LONG(0, taskNum - 1);
-
- CCareerTask *temp = taskVector[0];
-
- taskVector[0] = taskVector[rand];
- taskVector[rand] = temp;
+ SWAP(taskVector[0], taskVector[rand]);
}
if (!taskNum)
@@ -8754,11 +8740,7 @@ const char *CBasePlayer::PickSecondaryCareerTaskWeapon()
{
// randomize names weapons of list
int rand = RANDOM_LONG(0, taskNum - 1);
-
- CCareerTask *temp = taskVector[0];
-
- taskVector[0] = taskVector[rand];
- taskVector[rand] = temp;
+ SWAP(taskVector[0], taskVector[rand]);
}
if (!taskNum)
diff --git a/regamedll/dlls/player.h b/regamedll/dlls/player.h
index a89b1dc5..60d3f1a1 100644
--- a/regamedll/dlls/player.h
+++ b/regamedll/dlls/player.h
@@ -606,7 +606,7 @@ public:
void RemoveBomb();
CBasePlayerItem *GetItemOfNamed(const char *pszItemName);
-#ifdef REGAMEDLL_ADD
+#ifdef REGAMEDLL_API
CCSPlayer *CSPlayer() const;
#endif
@@ -843,7 +843,7 @@ inline bool CBasePlayer::IsReloading() const
return false;
}
-#ifdef REGAMEDLL_ADD
+#ifdef REGAMEDLL_API
inline CCSPlayer *CBasePlayer::CSPlayer() const {
return reinterpret_cast(this->m_pEntity);
}
diff --git a/regamedll/dlls/training_gamerules.cpp b/regamedll/dlls/training_gamerules.cpp
index db51ba72..24332a2c 100644
--- a/regamedll/dlls/training_gamerules.cpp
+++ b/regamedll/dlls/training_gamerules.cpp
@@ -45,7 +45,7 @@ void CHalfLifeTraining::HostageDied()
{
CBasePlayer *pPlayer = UTIL_PlayerByIndex(1);
- if (pPlayer != NULL)
+ if (pPlayer)
{
pPlayer->pev->radsuit_finished = gpGlobals->time + 3.0f;
}
@@ -134,9 +134,9 @@ void CHalfLifeTraining::__MAKE_VHOOK(PlayerThink)(CBasePlayer *pPlayer)
}
CGrenade *pBomb = NULL;
- while ((pBomb = (CGrenade *)UTIL_FindEntityByClassname(pBomb, "grenade")) != NULL)
+ while ((pBomb = (CGrenade *)UTIL_FindEntityByClassname(pBomb, "grenade")))
{
- if (pBomb->m_pentCurBombTarget != NULL)
+ if (pBomb->m_pentCurBombTarget)
pBomb->m_bStartDefuse = true;
}
@@ -194,7 +194,7 @@ void CHalfLifeTraining::__MAKE_VHOOK(PlayerThink)(CBasePlayer *pPlayer)
pPlayer->pev->scale = pPlayer->m_iAccount;
pPlayer->pev->ideal_yaw = pPlayer->m_bHasDefuser;
- if (TheBots != NULL)
+ if (TheBots)
{
TheBots->OnEvent(EVENT_PLAYER_CHANGED_TEAM, pPlayer);
}
@@ -220,7 +220,7 @@ void CHalfLifeTraining::__MAKE_VHOOK(PlayerSpawn)(CBasePlayer *pPlayer)
CBaseEntity *pWeaponEntity = NULL;
- while ((pWeaponEntity = UTIL_FindEntityByClassname(pWeaponEntity, "game_player_equip")) != NULL)
+ while ((pWeaponEntity = UTIL_FindEntityByClassname(pWeaponEntity, "game_player_equip")))
{
pWeaponEntity->Touch(pPlayer);
}
@@ -259,7 +259,7 @@ void CHalfLifeTraining::__MAKE_VHOOK(CheckWinConditions)()
{
CGrenade *pBomb = NULL;
- while ((pBomb = (CGrenade *)UTIL_FindEntityByClassname(pBomb, "grenade")) != NULL)
+ while ((pBomb = (CGrenade *)UTIL_FindEntityByClassname(pBomb, "grenade")))
{
if (!pBomb->m_bIsC4 || !pBomb->m_bJustBlew)
continue;
@@ -274,7 +274,7 @@ void CHalfLifeTraining::__MAKE_VHOOK(CheckWinConditions)()
{
CGrenade *pBomb = NULL;
- while ((pBomb = (CGrenade *)UTIL_FindEntityByClassname(pBomb, "grenade")) != NULL)
+ while ((pBomb = (CGrenade *)UTIL_FindEntityByClassname(pBomb, "grenade")))
{
if (!pBomb->m_bIsC4 || !pBomb->m_bJustBlew)
continue;
@@ -291,7 +291,7 @@ void CHalfLifeTraining::__MAKE_VHOOK(CheckWinConditions)()
pHostage = CBaseEntity::Instance(FIND_ENTITY_BY_CLASSNAME(NULL, "hostage_entity"));
- while (pHostage != NULL)
+ while (pHostage)
{
if (pHostage->pev->deadflag != DEAD_RESPAWNABLE || !FStringNull(pHostage->pev->noise1))
continue;
@@ -304,7 +304,7 @@ void CHalfLifeTraining::__MAKE_VHOOK(CheckWinConditions)()
pFirstRescueArea = CBaseEntity::Instance(FIND_ENTITY_BY_CLASSNAME(NULL, "func_hostage_rescue"));
pRescueArea = pFirstRescueArea;
- if (pFirstRescueArea != NULL)
+ if (pFirstRescueArea)
{
while (pRescueArea != pFirstRescueArea)
{
@@ -365,7 +365,7 @@ void CBaseGrenCatch::__MAKE_VHOOK(Think)()
m_fSmokeTouching = false;
pGrenade = NULL;
- while (pGrenade = (CGrenade *)UTIL_FindEntityByClassname(pGrenade, "grenade"))
+ while ((pGrenade = (CGrenade *)UTIL_FindEntityByClassname(pGrenade, "grenade")))
{
vMin = pGrenade->pev->mins;
vMax = pGrenade->pev->maxs;
@@ -391,7 +391,7 @@ void CBaseGrenCatch::__MAKE_VHOOK(Think)()
{
pTrigger = NULL;
- while ((pTrigger = UTIL_FindEntityByTargetname(pTrigger, STRING(sDisableOnGrenade))) != NULL)
+ while ((pTrigger = UTIL_FindEntityByTargetname(pTrigger, STRING(sDisableOnGrenade))))
{
// save solid
pTrigger->pev->team = pTrigger->pev->solid;
@@ -406,7 +406,7 @@ void CBaseGrenCatch::__MAKE_VHOOK(Think)()
{
pTrigger = NULL;
- while (pTrigger = UTIL_FindEntityByTargetname(pTrigger, STRING(sDisableOnGrenade)))
+ while ((pTrigger = UTIL_FindEntityByTargetname(pTrigger, STRING(sDisableOnGrenade))))
{
// restore solid
pTrigger->pev->solid = pTrigger->pev->team;
diff --git a/regamedll/dlls/triggers.cpp b/regamedll/dlls/triggers.cpp
index f0baa840..2f7cf023 100644
--- a/regamedll/dlls/triggers.cpp
+++ b/regamedll/dlls/triggers.cpp
@@ -557,12 +557,44 @@ void CTriggerCDAudio::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pC
PlayTrack();
}
+#ifdef REGAMEDLL_FIXES
+const char *g_szMP3trackFileMap[] =
+{
+ "", "",
+ "media/Half-Life01.mp3",
+ "media/Prospero01.mp3",
+ "media/Half-Life12.mp3",
+ "media/Half-Life07.mp3",
+ "media/Half-Life10.mp3",
+ "media/Suspense01.mp3",
+ "media/Suspense03.mp3",
+ "media/Half-Life09.mp3",
+ "media/Half-Life02.mp3",
+ "media/Half-Life13.mp3",
+ "media/Half-Life04.mp3",
+ "media/Half-Life15.mp3",
+ "media/Half-Life14.mp3",
+ "media/Half-Life16.mp3",
+ "media/Suspense02.mp3",
+ "media/Half-Life03.mp3",
+ "media/Half-Life08.mp3",
+ "media/Prospero02.mp3",
+ "media/Half-Life05.mp3",
+ "media/Prospero04.mp3",
+ "media/Half-Life11.mp3",
+ "media/Half-Life06.mp3",
+ "media/Prospero03.mp3",
+ "media/Half-Life17.mp3",
+ "media/Prospero05.mp3",
+ "media/Suspense05.mp3",
+ "media/Suspense07.mp3"
+};
+#endif
+
void PlayCDTrack(int iTrack)
{
- edict_t *pClient;
-
// manually find the single player.
- pClient = INDEXENT(1);
+ edict_t *pClient = INDEXENT(1);
// Can't play if the client is not connected!
if (!pClient)
@@ -576,15 +608,22 @@ void PlayCDTrack(int iTrack)
if (iTrack == -1)
{
+#ifdef REGAMEDLL_FIXES
+ CLIENT_COMMAND(pClient, "mp3 stop\n");
+#else
CLIENT_COMMAND(pClient, "cd stop\n");
+#endif
}
else
{
+#ifdef REGAMEDLL_FIXES
+ CLIENT_COMMAND(pClient, UTIL_VarArgs("mp3 play %s\n", g_szMP3trackFileMap[iTrack]));
+#else
char string[64];
Q_sprintf(string, "cd play %3d\n", iTrack);
CLIENT_COMMAND(pClient, string);
+#endif
}
-
}
// only plays for ONE client, so only use in single play!
@@ -628,10 +667,8 @@ void CTargetCDAudio::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCa
// only plays for ONE client, so only use in single play!
void CTargetCDAudio::__MAKE_VHOOK(Think)()
{
- edict_t *pClient;
-
// manually find the single player.
- pClient = INDEXENT(1);
+ edict_t *pClient = INDEXENT(1);
// Can't play if the client is not connected!
if (!pClient)
diff --git a/regamedll/dlls/tutor_cs_tutor.cpp b/regamedll/dlls/tutor_cs_tutor.cpp
index da0607b9..cdf8cf72 100644
--- a/regamedll/dlls/tutor_cs_tutor.cpp
+++ b/regamedll/dlls/tutor_cs_tutor.cpp
@@ -2527,7 +2527,7 @@ void CCSTutor::CheckForTimeRunningOut()
{
CBasePlayer *localPlayer = UTIL_GetLocalPlayer();
- if (localPlayer == NULL || CSGameRules()->IsFreezePeriod() || CSGameRules()->TimeRemaining() > 30.0f)
+ if (localPlayer == NULL || CSGameRules()->IsFreezePeriod() || CSGameRules()->GetRoundRemainingTime() > 30.0f)
return;
if (IsBombMap())
diff --git a/regamedll/dlls/util.cpp b/regamedll/dlls/util.cpp
index 95ae4e65..d7395dab 100644
--- a/regamedll/dlls/util.cpp
+++ b/regamedll/dlls/util.cpp
@@ -2361,11 +2361,14 @@ int UTIL_ReadFlags(const char *c)
// Determine whether bots can be used or not
bool UTIL_AreBotsAllowed()
{
+#ifdef REGAMEDLL_ADD
if (g_engfuncs.pfnEngCheckParm == NULL)
return false;
+#endif
if (g_bIsCzeroGame)
{
+#ifdef REGAMEDLL_ADD
// If they pass in -nobots, don't allow bots. This is for people who host servers, to
// allow them to disallow bots to enforce CPU limits.
int nobots = ENG_CHECK_PARM("-nobots", NULL);
@@ -2373,6 +2376,7 @@ bool UTIL_AreBotsAllowed()
{
return false;
}
+#endif
return true;
}
diff --git a/regamedll/dlls/weapontype.h b/regamedll/dlls/weapontype.h
index 4c0f847a..872bc021 100644
--- a/regamedll/dlls/weapontype.h
+++ b/regamedll/dlls/weapontype.h
@@ -412,9 +412,8 @@ struct WeaponInfoStruct
AmmoType ammoType;
char *entityName;
-#ifndef HOOK_GAMEDLL
+ // custom
const char *ammoName;
-#endif
};
struct WeaponSlotInfo
diff --git a/regamedll/extra/Toolkit/GameDefinitionFile/regamedll-cs.fgd b/regamedll/extra/Toolkit/GameDefinitionFile/regamedll-cs.fgd
index f458d9b3..cc26f276 100644
--- a/regamedll/extra/Toolkit/GameDefinitionFile/regamedll-cs.fgd
+++ b/regamedll/extra/Toolkit/GameDefinitionFile/regamedll-cs.fgd
@@ -412,6 +412,12 @@
15: "Distort (Models)"
16: "Hologram (Distort + fade)"
// Strange effect. As seen, briefly, when a Gargantua dies.
+
+ 17: "Dead Player" // kRenderFxDeadPlayer
+ 18: "Explode" // kRenderFxExplode
+ 19: "Glow Shell" // kRenderFxGlowShell
+ 20 : "Clamp Min Scale" // kRenderFxClampMinScale
+ 21 : "Light Multiplier" // kRenderFxLightMultiplier
]
]
@@ -867,30 +873,13 @@
// style commented out, seems to serve no purpose besides adding
// to the lightdata load.
// style(integer) : "Style" : 32
- sounds(choices) : "Sound style" : 0 =
- [
- 0: "No Sound, None"
- // the rest of these may or may not work, copied from button
- 1: "Big zap & Warmup"
- 2: "Access Denied"
- 3: "Access Granted"
- 4: "Quick Combolock"
- 5: "Power Deadbolt 1"
- 6: "Power Deadbolt 2"
- 7: "Plunger"
- 8: "Small zap"
- 9: "Keycard Sound"
- 10: "Buzz"
- 11: "Buzz Off"
- 14: "Lightswitch"
- ]
message(string) : "Message (set sound too)"
spawnflags(flags) =
[
1: "Monsters" : 0
2: "No Players, entity only" : 0
4: "Pushables" : 0
- 64: "No reset on New Round"
+ 64: "No reset on New Round" : 0
]
]
@@ -1019,10 +1008,10 @@
// line below edited by Dmitrich! -->
// was: @PointClass base(Targetname, Angles, RenderFields) iconsprite("sprites/CS/cycler_sprite.spr") = cycler_sprite : "Sprite Cycler"
-@PointClass base(Targetname, Angles, Sequence) size(-16 -16 0, 16 16 72) studio() = cycler_sprite : "Sprite Cycler"
+@PointClass base(Targetname, Angles, RenderFields) size(-16 -16 0, 16 16 72) studio() = cycler_sprite : "Sprite Cycler"
[
- model(sprite) : "Sprite/model path/name"
- sequence(string) : "model only sequence # of animation" : ""
+ model(studio) : "Model / Sprite" : ""
+ sequence(string) : "Animation # sequence (Models only)" : ""
framerate(integer) : "Frames per second" : 10
]
@@ -1433,11 +1422,6 @@
[
1: "Use Only" : 0
]
- weapon_briefcase (choices) : "Give Nightvision" : 0 =
- [
- 0: "No"
- 1: "Yes"
- ]
weapon_knife (choices) : "Give Knife" : 0 =
[
0: "No"
@@ -1563,7 +1547,7 @@
0: "No"
1: "Yes"
]
- weapon_shieldgun (choices) : "CS 1.6 Police Riot Shield" : 0 =
+ weapon_shield (choices) : "CS 1.6 Police Riot Shield" : 0 =
[
0: "No"
1: "Yes"
@@ -1680,7 +1664,6 @@
5: "5 Clips"
6: "6 Clips"
7: "7 Clips (Fill FN M249 Para)"
-
]
ammo_338magnum (choices) : "Give .338 AWP Ammo" : 0 =
[
diff --git a/regamedll/extra/Toolkit/GameDefinitionFile/sprites/CS/cycler_sprite.spr b/regamedll/extra/Toolkit/GameDefinitionFile/sprites/CS/cycler_sprite.spr
deleted file mode 100644
index e52026c3..00000000
Binary files a/regamedll/extra/Toolkit/GameDefinitionFile/sprites/CS/cycler_sprite.spr and /dev/null differ
diff --git a/regamedll/extra/cssdk/dlls/gamerules.h b/regamedll/extra/cssdk/dlls/gamerules.h
index cce267d6..f9e57f6c 100644
--- a/regamedll/extra/cssdk/dlls/gamerules.h
+++ b/regamedll/extra/cssdk/dlls/gamerules.h
@@ -150,7 +150,8 @@ enum RewardAccount
REWARD_VIP_HAVE_SELF_RESCUED = 2500,
REWARD_TAKEN_HOSTAGE = 1000
-
+ REWARD_TOOK_HOSTAGE_ACC = 100,
+ REWARD_TOOK_HOSTAGE = 150,
};
// custom enum
@@ -323,7 +324,7 @@ public:
virtual void ServerDeactivate() = 0;
virtual void CheckMapConditions() = 0;
public:
- BOOL m_bFreezePeriod;
+ BOOL m_bFreezePeriod; // TRUE at beginning of round, set to FALSE when the period expires
BOOL m_bBombDropped;
// custom
@@ -549,20 +550,17 @@ public:
bool ShouldSkipSpawn() const { return m_bSkipSpawn; }
void MarkSpawnSkipped() { m_bSkipSpawn = false; }
- float TimeRemaining() { return m_iRoundTimeSecs - gpGlobals->time + m_fRoundCount; }
- bool IsMatchStarted() { return (m_fTeamCount != 0.0f || m_fCareerRoundMenuTime != 0.0f || m_fCareerMatchMenuTime != 0.0f); }
+ float GetRoundRemainingTime() const { return m_iRoundTimeSecs - gpGlobals->time + m_fRoundStartTime; }
+ float GetTimeLeft() const { return m_flTimeLimit - gpGlobals->time; }
+ bool IsMatchStarted() { return (m_flRestartRoundTime != 0.0f || m_fCareerRoundMenuTime != 0.0f || m_fCareerMatchMenuTime != 0.0f); }
+
+ void TerminateRound(float tmDelay, int iWinStatus);
- inline void TerminateRound(float tmDelay, int iWinStatus)
- {
- m_iRoundWinStatus = iWinStatus;
- m_fTeamCount = gpGlobals->time + tmDelay;
- m_bRoundTerminating = true;
- }
public:
CVoiceGameMgr m_VoiceGameMgr;
- float m_fTeamCount; // m_flRestartRoundTime, the global time when the round is supposed to end, if this is not 0
+ float m_flRestartRoundTime; // The global time when the round is supposed to end, if this is not 0 (deprecated name m_fTeamCount)
float m_flCheckWinConditions;
- float m_fRoundCount;
+ float m_fRoundStartTime; // Time round has started (deprecated name m_fRoundCount)
int m_iRoundTime; // (From mp_roundtime) - How many seconds long this round is.
int m_iRoundTimeSecs;
int m_iIntroRoundTime; // (From mp_freezetime) - How many seconds long the intro round (when players are frozen) is.
@@ -646,6 +644,8 @@ public:
bool m_bSkipShowMenu;
bool m_bNeededPlayers;
float m_flEscapeRatio;
+ float m_flTimeLimit;
+ float m_flGameStartTime;
};
typedef struct mapcycle_item_s
@@ -672,7 +672,15 @@ public:
extern CGameRules *g_pGameRules;
+// Gets us at the CS game rules
inline CHalfLifeMultiplay *CSGameRules()
{
- return reinterpret_cast(g_pGameRules);
+ return static_cast(g_pGameRules);
+}
+
+inline void CHalfLifeMultiplay::TerminateRound(float tmDelay, int iWinStatus)
+{
+ m_iRoundWinStatus = iWinStatus;
+ m_flRestartRoundTime = gpGlobals->time + tmDelay;
+ m_bRoundTerminating = true;
}
diff --git a/regamedll/extra/cssdk/game_shared/bot/bot_manager.h b/regamedll/extra/cssdk/game_shared/bot/bot_manager.h
index e2327531..5be97b06 100644
--- a/regamedll/extra/cssdk/game_shared/bot/bot_manager.h
+++ b/regamedll/extra/cssdk/game_shared/bot/bot_manager.h
@@ -47,6 +47,8 @@ typedef std::list ActiveGrenadeList;
class CBotManager {
public:
+ virtual ~CBotManager() {}
+
virtual void ClientDisconnect(CBasePlayer *pPlayer) = 0;
virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd) = 0;
diff --git a/regamedll/game_shared/bot/bot_manager.h b/regamedll/game_shared/bot/bot_manager.h
index b982253b..e4442829 100644
--- a/regamedll/game_shared/bot/bot_manager.h
+++ b/regamedll/game_shared/bot/bot_manager.h
@@ -67,6 +67,7 @@ class CBotManager
{
public:
CBotManager();
+ virtual ~CBotManager() {}
virtual void ClientDisconnect(CBasePlayer *pPlayer) = 0;
virtual BOOL ClientCommand(CBasePlayer *pPlayer, const char *pcmd) = 0;
diff --git a/regamedll/game_shared/bot/nav_area.cpp b/regamedll/game_shared/bot/nav_area.cpp
index f3c537cb..6d83a20f 100644
--- a/regamedll/game_shared/bot/nav_area.cpp
+++ b/regamedll/game_shared/bot/nav_area.cpp
@@ -4215,8 +4215,18 @@ void EditNavAreas(NavEditCmdType cmd)
{
// create the new nav area
CNavArea *newArea = new CNavArea(&anchor, &cursor);
+
+#ifdef REGAMEDLL_FIXES
+ if (TheNavAreaList.empty())
+ {
+ // first add the areas to the grid
+ TheNavAreaGrid.Initialize(8192.0f, -8192.0f, 8192.0f, -8192.0f);
+ }
+#endif
+
TheNavAreaList.push_back(newArea);
TheNavAreaGrid.AddNavArea(newArea);
+
EMIT_SOUND_DYN(ENT(UTIL_GetLocalPlayer()->pev), CHAN_ITEM, "buttons/blip1.wav", 1, ATTN_NORM, 0, 100);
// if we have a marked area, inter-connect the two
@@ -4255,6 +4265,7 @@ void EditNavAreas(NavEditCmdType cmd)
{
EMIT_SOUND_DYN(ENT(UTIL_GetLocalPlayer()->pev), CHAN_ITEM, "buttons/button11.wav", 1, ATTN_NORM, 0, 100);
}
+
break;
}
}
diff --git a/regamedll/hookers/6153_hooker.cpp b/regamedll/hookers/6153_hooker.cpp
index 05cc2de0..55ce72e9 100644
--- a/regamedll/hookers/6153_hooker.cpp
+++ b/regamedll/hookers/6153_hooker.cpp
@@ -165,7 +165,7 @@ FunctionHook g_FunctionHooks[] =
{ 0x01DB2B50, "PM_Friction", (size_t)&PM_Friction },
{ 0x01DB2CF0, "PM_AirAccelerate", (size_t)&PM_AirAccelerate },
{ 0x01DB2DB0, "PM_WaterMove", (size_t)&PM_WaterMove },
- { 0x01DB30C0, "PM_AirMove", (size_t)&PM_AirMove },
+ { 0x01DB30C0, "PM_AirMove", (size_t)&PM_AirMove_internal },
//{ 0x01DB3200, "PM_InWater", (size_t)&PM_InWater }, // NOXREF
{ 0x01DB3220, "PM_CheckWater", (size_t)&PM_CheckWater },
{ 0x01DB33E0, "PM_CatagorizePosition", (size_t)&PM_CatagorizePosition },
@@ -278,7 +278,7 @@ FunctionHook g_FunctionHooks[] =
{ 0x01D64F00, "Q_strlen", (size_t)&Q_strlen_ },
{ 0x01D64F20, "_Z8Host_SayP7edict_si", (size_t)&Host_Say },
//{ 0x0, "", (size_t)&DropSecondary }, // NOXREF
- { 0x01D656F0, "_Z11DropPrimaryP11CBasePlayer", (size_t)&DropPrimary },
+ //{ 0x01D656F0, "_Z11DropPrimaryP11CBasePlayer", (size_t)&DropPrimary },
{ 0x01D65740, "_Z10CanBuyThisP11CBasePlayeri", (size_t)&CanBuyThis },
{ 0x01D65850, "_Z9BuyPistolP11CBasePlayeri", (size_t)&BuyPistol },
{ 0x01D65A30, "_Z10BuyShotgunP11CBasePlayeri", (size_t)&BuyShotgun },
@@ -644,7 +644,7 @@ FunctionHook g_FunctionHooks[] =
//{ 0x01D9B9A0, "_ZN11CBasePlayer10SmartRadioEv", mfunc_ptr_cast(&CBasePlayer::SmartRadio) }, // NOXREF
{ 0x01DA07D0, "_ZN11CBasePlayer11ThrowWeaponEPc", mfunc_ptr_cast(&CBasePlayer::ThrowWeapon) }, // NOXREF
//{ 0x01DA0DB0, "_ZN11CBasePlayer12ThrowPrimaryEv", mfunc_ptr_cast(&CBasePlayer::ThrowPrimary) }, // NOXREF
- { 0x01DA1170, "_ZN11CBasePlayer10AddAccountEib", mfunc_ptr_cast(&CBasePlayer::AddAccount) },
+ //{ 0x01DA1170, "_ZN11CBasePlayer10AddAccountEib", mfunc_ptr_cast(&CBasePlayer::AddAccount) },
{ 0x01DA1DA0, "_ZN11CBasePlayer9DisappearEv", mfunc_ptr_cast(&CBasePlayer::Disappear) },
{ 0x01DA15B0, "_ZN11CBasePlayer7MakeVIPEv", mfunc_ptr_cast(&CBasePlayer::MakeVIP) },
{ 0x01DA36C0, "_ZN11CBasePlayer12CanPlayerBuyEb", mfunc_ptr_cast(&CBasePlayer::CanPlayerBuy) },
@@ -1908,17 +1908,17 @@ FunctionHook g_FunctionHooks[] =
{ 0x01D87730, "_ZN5CItem11MaterializeEv", mfunc_ptr_cast(&CItem::Materialize) },
//CWorldItem
//virtual func
- { 0x01D874A0, "_ZN10CWorldItem5SpawnEv", mfunc_ptr_cast(&CWorldItem::Spawn_) },
- { 0x01D87450, "_ZN10CWorldItem8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CWorldItem::KeyValue_) },
+ //{ 0x01D874A0, "_ZN10CWorldItem5SpawnEv", mfunc_ptr_cast(&CWorldItem::Spawn_) },
+ //{ 0x01D87450, "_ZN10CWorldItem8KeyValueEP14KeyValueData_s", mfunc_ptr_cast(&CWorldItem::KeyValue_) },
//linked objects
- { 0x01D87400, "world_items", (size_t)&world_items },
+ //{ 0x01D87400, "world_items", (size_t)&world_items },
//CItemSuit
//virtual func
- { 0x01D877F0, "_ZN9CItemSuit5SpawnEv", mfunc_ptr_cast(&CItemSuit::Spawn_) },
- { 0x01D878B0, "_ZN9CItemSuit8PrecacheEv", mfunc_ptr_cast(&CItemSuit::Precache_) },
- { 0x01D878D0, "_ZN9CItemSuit7MyTouchEP11CBasePlayer", mfunc_ptr_cast(&CItemSuit::MyTouch_) },
+ //{ 0x01D877F0, "_ZN9CItemSuit5SpawnEv", mfunc_ptr_cast(&CItemSuit::Spawn_) },
+ //{ 0x01D878B0, "_ZN9CItemSuit8PrecacheEv", mfunc_ptr_cast(&CItemSuit::Precache_) },
+ //{ 0x01D878D0, "_ZN9CItemSuit7MyTouchEP11CBasePlayer", mfunc_ptr_cast(&CItemSuit::MyTouch_) },
//linked objects
- { 0x01D877A0, "item_suit", (size_t)&item_suit },
+ //{ 0x01D877A0, "item_suit", (size_t)&item_suit },
//CItemBattery
//virtual func
{ 0x01D87990, "_ZN12CItemBattery5SpawnEv", mfunc_ptr_cast(&CItemBattery::Spawn_) },
@@ -1935,11 +1935,11 @@ FunctionHook g_FunctionHooks[] =
{ 0x01D87BC0, "item_antidote", (size_t)&item_antidote },
//CItemSecurity
//virtual func
- { 0x01D87D60, "_ZN13CItemSecurity5SpawnEv", mfunc_ptr_cast(&CItemSecurity::Spawn_) },
- { 0x01D87E20, "_ZN13CItemSecurity8PrecacheEv", mfunc_ptr_cast(&CItemSecurity::Precache_) },
- { 0x01D87E30, "_ZN13CItemSecurity7MyTouchEP11CBasePlayer", mfunc_ptr_cast(&CItemSecurity::MyTouch_) },
+ //{ 0x01D87D60, "_ZN13CItemSecurity5SpawnEv", mfunc_ptr_cast(&CItemSecurity::Spawn_) },
+ //{ 0x01D87E20, "_ZN13CItemSecurity8PrecacheEv", mfunc_ptr_cast(&CItemSecurity::Precache_) },
+ //{ 0x01D87E30, "_ZN13CItemSecurity7MyTouchEP11CBasePlayer", mfunc_ptr_cast(&CItemSecurity::MyTouch_) },
//linked objects
- { 0x01D87D10, "item_security", (size_t)&item_security },
+ //{ 0x01D87D10, "item_security", (size_t)&item_security },
//CItemLongJump
//virtual func
{ 0x01D87EA0, "_ZN13CItemLongJump5SpawnEv", mfunc_ptr_cast(&CItemLongJump::Spawn_) },
@@ -2531,7 +2531,7 @@ FunctionHook g_FunctionHooks[] =
{ 0x01D01140, "_Z21WeaponIDToWeaponClassi", (size_t)&WeaponIDToWeaponClass },
{ 0x01D011C0, "_Z15IsPrimaryWeaponi", (size_t)&IsPrimaryWeapon },
//{ 0x01D01250, "_Z17IsSecondaryWeaponi", (size_t)&IsSecondaryWeapon }, // NOXREF
- { 0x01D012A0, "_Z13GetWeaponInfoi", (size_t)&GetWeaponInfo },
+ { 0x01D012A0, "_Z13GetWeaponInfoi", mfunc_ptr_cast(&GetWeaponInfo) },
{ 0x01D012E0, "_Z21CanBuyWeaponByMaptypei12WeaponIdTypeb", (size_t)&CanBuyWeaponByMaptype },
#endif // WeaponType_Region
@@ -4453,7 +4453,7 @@ FunctionHook g_FunctionHooks[] =
{ 0x01D206A0, "_Z17InstallBotControlv", (size_t)&InstallBotControl },
{ 0x01D20730, "_Z17Bot_ServerCommandv", (size_t)&Bot_ServerCommand },
- { 0x01D20760, "_Z17Bot_RegisterCvarsv", (size_t)&Bot_RegisterCvars },
+ { 0x01D20760, "_Z17Bot_RegisterCvarsv", (size_t)&Bot_RegisterCVars },
#endif // CS_Init_Region
diff --git a/regamedll/hookers/hooker_impl.cpp b/regamedll/hookers/hooker_impl.cpp
index ecb103c3..36e4e32e 100644
--- a/regamedll/hookers/hooker_impl.cpp
+++ b/regamedll/hookers/hooker_impl.cpp
@@ -214,8 +214,8 @@ CCareerTaskManager *TheCareerTasks;
const TaskInfo taskInfo[21];
// globals client.cpp
-float g_flTimeLimit;
-float g_flResetTime;
+float g_flTimeLimit; // moved from gamerules
+float g_flResetTime; // moved from gamerules
bool g_bClientPrintEnable;
char *sPlayerModelFiles[12];
@@ -936,7 +936,7 @@ void CFuncTank::Precache() { Precache_(); }
void CFuncTank::KeyValue(KeyValueData *pkvd) { KeyValue_(pkvd); }
int CFuncTank::Save(CSave &save) { return Save_(save); }
int CFuncTank::Restore(CRestore &restore) { return Restore_(restore); }
-BOOL CFuncTank::OnControls(entvars_t *pevTest) { OnControls_(pevTest); }
+BOOL CFuncTank::OnControls(entvars_t *pevTest) { return OnControls_(pevTest); }
void CFuncTank::Think() { Think_(); }
void CFuncTank::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { Use_(pActivator, pCaller, useType, value); }
void CFuncTank::Fire(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) { Fire_(barrelEnd, forward, pevAttacker); }
@@ -970,8 +970,8 @@ BOOL CGameRules::CanHaveAmmo(CBasePlayer *pPlayer, const char *pszAmmoName, int
// grenade
void CGrenade::Spawn() { Spawn_(); }
-int CGrenade::Save(CSave &save) { Save_(save); }
-int CGrenade::Restore(CRestore &restore) { Restore_(restore); }
+int CGrenade::Save(CSave &save) { return Save_(save); }
+int CGrenade::Restore(CRestore &restore) { return Restore_(restore); }
void CGrenade::Killed(entvars_t *pevAttacker, int iGib) { Killed_(pevAttacker, iGib); }
void CGrenade::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { Use_(pActivator, pCaller, useType, value); }
void CGrenade::BounceSound() { BounceSound_(); }
@@ -1032,12 +1032,12 @@ void CWallHealth::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE us
void CItem::Spawn() { Spawn_(); }
CBaseEntity *CItem::Respawn() { return Respawn_(); }
-void CWorldItem::Spawn() { Spawn_(); }
-void CWorldItem::KeyValue(KeyValueData *pkvd) { KeyValue_(pkvd); }
+//void CWorldItem::Spawn() { Spawn_(); }
+//void CWorldItem::KeyValue(KeyValueData *pkvd) { KeyValue_(pkvd); }
-void CItemSuit::Spawn() { Spawn_(); }
-void CItemSuit::Precache() { Precache_(); }
-BOOL CItemSuit::MyTouch(CBasePlayer *pPlayer) { return MyTouch_(pPlayer); }
+//void CItemSuit::Spawn() { Spawn_(); }
+//void CItemSuit::Precache() { Precache_(); }
+//BOOL CItemSuit::MyTouch(CBasePlayer *pPlayer) { return MyTouch_(pPlayer); }
void CItemBattery::Spawn() { Spawn_(); }
void CItemBattery::Precache() { Precache_(); }
@@ -1047,9 +1047,9 @@ void CItemAntidote::Spawn() { Spawn_(); }
void CItemAntidote::Precache() { Precache_(); }
BOOL CItemAntidote::MyTouch(CBasePlayer *pPlayer) { return MyTouch_(pPlayer); }
-void CItemSecurity::Spawn() { Spawn_(); }
-void CItemSecurity::Precache() { Precache_(); }
-BOOL CItemSecurity::MyTouch(CBasePlayer *pPlayer) { return MyTouch_(pPlayer); }
+//void CItemSecurity::Spawn() { Spawn_(); }
+//void CItemSecurity::Precache() { Precache_(); }
+//BOOL CItemSecurity::MyTouch(CBasePlayer *pPlayer) { return MyTouch_(pPlayer); }
void CItemLongJump::Spawn() { Spawn_(); }
void CItemLongJump::Precache() { Precache_(); }
@@ -1380,8 +1380,8 @@ void CAmbientGeneric::Spawn() { Spawn_(); }
void CAmbientGeneric::Precache() { Precache_(); }
void CAmbientGeneric::Restart() { Restart_(); }
void CAmbientGeneric::KeyValue(KeyValueData *pkvd) { KeyValue_(pkvd); }
-int CAmbientGeneric::Save(CSave &save) { Save_(save); }
-int CAmbientGeneric::Restore(CRestore &restore) { Restore_(restore); }
+int CAmbientGeneric::Save(CSave &save) { return Save_(save); }
+int CAmbientGeneric::Restore(CRestore &restore) { return Restore_(restore); }
void CEnvSound::Spawn() { Spawn_(); }
void CEnvSound::KeyValue(KeyValueData *pkvd) { KeyValue_(pkvd); }
diff --git a/regamedll/hookers/hooker_impl.h b/regamedll/hookers/hooker_impl.h
index 4d1617b3..da3b8563 100644
--- a/regamedll/hookers/hooker_impl.h
+++ b/regamedll/hookers/hooker_impl.h
@@ -91,6 +91,7 @@ typedef float FloatRef;
#define LINK_HOOK_CLASS_CUSTOM_CHAIN2(...)
#define LINK_HOOK_VOID_CHAIN(...)
#define LINK_HOOK_CHAIN(...)
+#define LINK_HOOK_CHAIN2(...)
// refs
extern void (CBaseEntity::*pCHostage__IdleThink)();
@@ -924,6 +925,9 @@ extern char pm_grgszTextureName[1024][17];
extern char pm_grgchTextureType[1024];
extern char *BotDifficultyName[5];
+extern float g_flResetTime;
+C_DLLEXPORT float g_flTimeLimit;
+
// declared functions
C_DLLEXPORT void WINAPI GiveFnptrsToDll(enginefuncs_t *pEnginefuncsTable, globalvars_t *pGlobals);
bool NavAreaBuildPath__HostagePathCost__wrapper(CNavArea *startArea, CNavArea *goalArea, const Vector *goalPos, HostagePathCost &costFunc, CNavArea **closestArea);
@@ -951,7 +955,7 @@ void PM_WalkMove();
void PM_Friction();
void PM_AirAccelerate(vec_t *wishdir, float wishspeed, float accel);
void PM_WaterMove();
-void PM_AirMove();
+void PM_AirMove(int playerIndex = 0);
qboolean PM_InWater();
qboolean PM_CheckWater();
void PM_CatagorizePosition();
diff --git a/regamedll/hookers/main.cpp b/regamedll/hookers/main.cpp
index 9c7f5781..cea4f6ea 100644
--- a/regamedll/hookers/main.cpp
+++ b/regamedll/hookers/main.cpp
@@ -27,6 +27,7 @@
*/
#include "precompiled.h"
+#include "FileSystem.h"
#ifdef _WIN32
#include
diff --git a/regamedll/public/MemPool.h b/regamedll/public/MemPool.h
index 79a11ea1..4e8c3b49 100644
--- a/regamedll/public/MemPool.h
+++ b/regamedll/public/MemPool.h
@@ -32,7 +32,6 @@
#pragma once
#endif
-/* <2cab3d> ../public/MemPool.h:18 */
class CMemoryPool
{
public:
diff --git a/shared_icc.gradle b/shared_icc.gradle
index 32349316..c2e47fc2 100644
--- a/shared_icc.gradle
+++ b/shared_icc.gradle
@@ -21,6 +21,7 @@ rootProject.ext.createIccConfig = { boolean release, BinaryKind binKind ->
linkerOptions: new GccToolchainConfig.LinkerOptions(
interProceduralOptimizations: true, // -ipo
stripSymbolTable: true,
+ staticLibStdCpp: false,
staticLibGcc: true,
staticIntel: true,
),
@@ -46,6 +47,7 @@ rootProject.ext.createIccConfig = { boolean release, BinaryKind binKind ->
linkerOptions: new GccToolchainConfig.LinkerOptions(
interProceduralOptimizations: false,
stripSymbolTable: false,
+ staticLibStdCpp: false,
staticLibGcc: true,
staticIntel: true,
),