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, ),