diff --git a/README.md b/README.md index c1c4cb2b..ce83630d 100644 --- a/README.md +++ b/README.md @@ -22,25 +22,26 @@ Archive's bin directory contains 2 subdirectories, 'bugfixed' and 'pure' | CVar | Default | Min | Max | Description | | :---------------------------- | :-----: | :-: | :----------: | :--------------------------------------------- | | mp_freeforall | 0 | 0 | 1 | The style of gameplay where there aren't any teams (FFA mode)
`0` disabled
`1` enabled | -| mp_autoteambalance | 1 | 0 | 2 | Auto balancing of teams
`0` disabled
`1` on after next round
`2` on next round | +| mp_autoteambalance | 1 | 0 | 2 | Auto balancing of teams.
`0` disabled
`1` on after next round
`2` on next round | | mp_buytime | 1.5 | 0.0 | - | Designate the desired amount of buy time for each round. (in minutes)
`-1` means no time limit
`0` disable buy | | mp_maxmoney | 16000 | 0 | `0x7FFFFFFF` | The maximum allowable amount of money in the game | | mp_round_infinite | 0 | 0 | 1 | Flags for fine grained control (choose as many as needed)
`0` disabled
`1` enabled

or flags
`a` block round time round end check
`b` block needed players round end check
`c` block VIP assassination/success round end check
`d` block prison escape round end check
`e` block bomb round end check
`f` block team extermination round end check
`g` block hostage rescue round end check

`Example setting:` "ae" blocks round time and bomb round end checks | | mp_roundover | 0 | - | - | The round by expired time will be over, if on a map it does not have the scenario of the game.
`0` disabled
`1` enabled | -| mp_hegrenade_penetration | 0 | 0 | 1 | Disable grenade damage through walls
`0` disabled
`1` enabled | -| mp_nadedrops | 0 | 0 | 2 | Drop a grenade after player death
`0` disabled
`1` drop one the grenade
`2` drop an everyone grenades | +| mp_hegrenade_penetration | 0 | 0 | 1 | Disable grenade damage through walls.
`0` disabled
`1` enabled | +| mp_nadedrops | 0 | 0 | 2 | Drop a grenade after player death.
`0` disabled
`1` drop one the grenade
`2` drop an 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 | 3 | Refill amount of backpack ammo up to the max
`0` disabled
`1` refill backpack ammo on player spawn
`2` refill backpack ammo on player spawn and on the purchase of the item
`3` 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_auto_reload_weapons | 0 | 0 | 1 | Automatically reload each weapon on player spawn.
`0` disabled
`1` enabled | +| mp_refill_bpammo_weapons | 0 | 0 | 3 | Refill amount of backpack ammo up to the max.
`0` disabled
`1` refill backpack ammo on player spawn
`2` refill backpack ammo on player spawn and on the purchase of the item
`3` 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 | -| mp_forcerespawn | 0 | 0 | - | Players will automatically respawn when killed.
`0` disabled
`>0` time delay to respawn | +| mp_forcerespawn | 0 | 0 | - | Players will automatically respawn when killed.
`0` disabled
`>0.00001` time delay to respawn | +| mp_hostage_hurtable | 1 | 0 | 1 | The hostages can take the damage.
`0` disabled
`1` enabled | | 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 | +| 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 7496f864..40f11528 100644 --- a/dist/game.cfg +++ b/dist/game.cfg @@ -86,16 +86,9 @@ mp_auto_reload_weapons "0" // Default value: "0" mp_refill_bpammo_weapons 0 -// Set's the mode for the zBot -// 0 - disabled -// 1 - enable mode Deathmatch and not allow to do the scenario -// -// Default value: "0" -bot_deathmatch 0 - // Automatically joins the team // 0 - disabled -// 1 - enable (Use in conjunction with the cvar humans_join_team any/CT/T) +// 1 - enabled (Use in conjunction with the cvar humans_join_team any/CT/T) // // Default value: "0" mp_auto_join_team 0 @@ -122,13 +115,26 @@ mp_timelimit 20 // Players will automatically respawn when killed. // 0 - disabled -// >0 - time delay to respawn +// >0.00001 - time delay to respawn // // Default value: "0" mp_forcerespawn 0 -// Debug cvar shows triggers. +// The hostages can take the damage. // 0 - disabled +// 1 - enabled (default behaviour) +mp_hostage_hurtable 1 + +// Set's the mode for the zBot +// 0 - disabled +// 1 - enable mode Deathmatch and not allow to do the scenario +// +// Default value: "0" +bot_deathmatch 0 + +// Debug cvar shows triggers. +// 0 - disabled (default behaviour) +// 1 - enabled // // Default value: "0" showtriggers 0 diff --git a/gradle.properties b/gradle.properties index 7c707007..9c6ff521 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ majorVersion=5 -minorVersion=0 +minorVersion=1 maintenanceVersion=0 diff --git a/regamedll/dlls/animation.cpp b/regamedll/dlls/animation.cpp index b8100b41..d7f563cb 100644 --- a/regamedll/dlls/animation.cpp +++ b/regamedll/dlls/animation.cpp @@ -1148,11 +1148,11 @@ void SV_StudioSetupBones(model_t *pModel, float frame, int sequence, const vec_t { if (!Q_strcmp(pbones[i].name, "Bip01 Spine")) { - bCopy = 0; + bCopy = false; } else if (!Q_strcmp(pbones[pbones[i].parent].name, "Bip01 Pelvis")) { - bCopy = 1; + bCopy = true; } if (bCopy) diff --git a/regamedll/dlls/bmodels.cpp b/regamedll/dlls/bmodels.cpp index 979ed3e6..d86f9b63 100644 --- a/regamedll/dlls/bmodels.cpp +++ b/regamedll/dlls/bmodels.cpp @@ -158,7 +158,7 @@ LINK_ENTITY_TO_CLASS(func_illusionary, CFuncIllusionary, CCSFuncIllusionary); void CFuncIllusionary::__MAKE_VHOOK(KeyValue)(KeyValueData *pkvd) { - //skin is used for content type + // skin is used for content type if (FStrEq(pkvd->szKeyName, "skin")) { pev->skin = Q_atoi(pkvd->szValue); diff --git a/regamedll/dlls/bot/cs_bot_manager.cpp b/regamedll/dlls/bot/cs_bot_manager.cpp index e7cd2e7e..511bd070 100644 --- a/regamedll/dlls/bot/cs_bot_manager.cpp +++ b/regamedll/dlls/bot/cs_bot_manager.cpp @@ -65,7 +65,7 @@ CCSBotManager::CCSBotManager() const char *dataFile = SharedParse(dataPointer); const char *token; - while (dataFile != NULL) + while (dataFile) { token = SharedGetToken(); char *clone = CloneString(token); @@ -627,7 +627,7 @@ void CCSBotManager::__MAKE_VHOOK(ServerCommand)(const char *pcmd) break; } - if (found != NULL) + if (found) { isAmbiguous = true; } @@ -669,10 +669,10 @@ void CCSBotManager::__MAKE_VHOOK(ServerCommand)(const char *pcmd) { // tell the first bot we find to go to our marked area CNavArea *area = GetMarkedArea(); - if (area != NULL) + if (area) { CBaseEntity *pEntity = NULL; - while ((pEntity = UTIL_FindEntityByClassname(pEntity, "player")) != NULL) + while ((pEntity = UTIL_FindEntityByClassname(pEntity, "player"))) { if (!pEntity->IsPlayer()) continue; @@ -685,7 +685,7 @@ void CCSBotManager::__MAKE_VHOOK(ServerCommand)(const char *pcmd) if (playerOrBot->IsBot()) { CCSBot *bot = static_cast(playerOrBot); - if (bot != NULL) + if (bot) { bot->MoveTo(&area->m_center, FASTEST_ROUTE); } @@ -811,7 +811,7 @@ bool CCSBotManager::BotAddCommand(BotProfileTeamType team, bool isFromConsole) { // in career, ignore humans bool ignoreHumans = false; - if (CSGameRules() != NULL && CSGameRules()->IsCareer()) + if (CSGameRules() && CSGameRules()->IsCareer()) ignoreHumans = true; if (UTIL_IsNameTaken(CMD_ARGV(1), ignoreHumans)) @@ -940,7 +940,7 @@ void CCSBotManager::MaintainBotQuota() } else { - if (CSGameRules() != NULL && !CSGameRules()->IsCareer()) + if (CSGameRules() && !CSGameRules()->IsCareer()) return; bool humansAreCTs = (Q_strcmp(humans_join_team.string, "CT") == 0); @@ -1091,7 +1091,8 @@ void CCSBotManager::ValidateMapData() m_zone[ m_zoneCount ].m_center = (isLegacy) ? entity->pev->origin : (entity->pev->absmax + entity->pev->absmin) / 2.0f; m_zone[ m_zoneCount ].m_isLegacy = isLegacy; m_zone[ m_zoneCount ].m_index = m_zoneCount; - m_zone[ m_zoneCount++ ].m_entity = entity; + m_zone[ m_zoneCount ].m_entity = entity; + m_zoneCount++; } else CONSOLE_ECHO("Warning: Too many zones, some will be ignored.\n"); @@ -1104,8 +1105,13 @@ void CCSBotManager::ValidateMapData() { entity = NULL; - while ((entity = UTIL_FindEntityByClassname(entity, "info_player_start")) != NULL) + while ((entity = UTIL_FindEntityByClassname(entity, "info_player_start"))) { +#ifdef REGAMEDLL_FIXES + if (m_zoneCount >= MAX_ZONES) + break; +#endif + if (FNullEnt(entity->edict())) break; @@ -1114,7 +1120,8 @@ void CCSBotManager::ValidateMapData() m_zone[ m_zoneCount ].m_center = entity->pev->origin; m_zone[ m_zoneCount ].m_isLegacy = true; m_zone[ m_zoneCount ].m_index = m_zoneCount; - m_zone[ m_zoneCount++ ].m_entity = entity; + m_zone[ m_zoneCount ].m_entity = entity; + m_zoneCount++; } else CONSOLE_ECHO("Warning: Too many zones, some will be ignored.\n"); @@ -1207,9 +1214,8 @@ bool CCSBotManager::AddBot(const BotProfile *profile, BotProfileTeamType team) if (HandleMenu_ChooseTeam(pBot, nTeamSlot)) { int skin = profile->GetSkin(); - if (!skin) - skin = 6;// MODEL_GIGN? + skin = 6; HandleMenu_ChooseAppearance(pBot, skin); diff --git a/regamedll/dlls/bot/states/cs_bot_defuse_bomb.cpp b/regamedll/dlls/bot/states/cs_bot_defuse_bomb.cpp index d6613034..6cae9d48 100644 --- a/regamedll/dlls/bot/states/cs_bot_defuse_bomb.cpp +++ b/regamedll/dlls/bot/states/cs_bot_defuse_bomb.cpp @@ -48,7 +48,7 @@ void DefuseBombState::__MAKE_VHOOK(OnUpdate)(CCSBot *me) if (!TheCSBots()->IsBombPlanted()) { #ifdef REGAMEDLL_ADD - if (CSGameRules()->HasRoundInfinite(SCENARIO_BLOCK_BOMB)) { + if (HasRoundInfinite(SCENARIO_BLOCK_BOMB)) { me->GetGameState()->Reset(); me->Hunt(); return; diff --git a/regamedll/dlls/cbase.cpp b/regamedll/dlls/cbase.cpp index 1fbdd5f1..1b1f3a66 100644 --- a/regamedll/dlls/cbase.cpp +++ b/regamedll/dlls/cbase.cpp @@ -26,7 +26,7 @@ DLL_FUNCTIONS gFunctionTable = &ClientDisconnect, &ClientKill, &ClientPutInServer, - &ClientCommand, + &ClientCommand_, &ClientUserInfoChanged, &ServerActivate, &ServerDeactivate, diff --git a/regamedll/dlls/cbase.h b/regamedll/dlls/cbase.h index db7066fa..6a4c6a71 100644 --- a/regamedll/dlls/cbase.h +++ b/regamedll/dlls/cbase.h @@ -85,8 +85,6 @@ #define CLASS_VEHICLE 14 #define CLASS_BARNACLE 99 // special because no one pays attention to it, and it eats a wide cross-section of creatures. -#define GIB_HEALTH_VALUE -30 - #define ROUTE_SIZE 8 #define MAX_OLD_ENEMIES 4 @@ -183,6 +181,7 @@ #define GIB_NORMAL 0 // gib if entity was overkilled #define GIB_NEVER 1 // never gib, no matter how much death damage is done ( freezing, etc ) #define GIB_ALWAYS 2 // always gib ( Houndeye Shock, Barnacle Bite ) +#define GIB_HEALTH_VALUE -30 #define SF_ITEM_USE_ONLY 256 diff --git a/regamedll/dlls/client.cpp b/regamedll/dlls/client.cpp index cf84266e..d5c7e4d7 100644 --- a/regamedll/dlls/client.cpp +++ b/regamedll/dlls/client.cpp @@ -152,7 +152,6 @@ void respawn(entvars_t *pev, BOOL fCopyCorpse) CSGameRules()->MarkSpawnSkipped(); CBasePlayer *pPlayer = GetClassPtr((CBasePlayer *)pev); - if (CSGameRules()->IsCareer() && CSGameRules()->ShouldSkipSpawn() && pPlayer->IsAlive()) g_skipCareerInitialSpawn = true; @@ -215,7 +214,7 @@ void EXT_FUNC __API_HOOK(ShowVGUIMenu)(CBasePlayer *pPlayer, int MenuType, int B #ifdef REGAMEDLL_ADD if (CSGameRules()->ShouldSkipShowMenu()) { CSGameRules()->MarkShowMenuSkipped(); - pPlayer->m_iMenu = Menu_OFF; + pPlayer->ResetMenu(); return; } @@ -1453,14 +1452,20 @@ void EXT_FUNC __API_HOOK(HandleMenu_ChooseAppearance)(CBasePlayer *player, int s appearance.model_name_index = 9; } +#ifdef REGAMEDLL_FIXES + player->ResetMenu(); +#else player->m_iMenu = Menu_OFF; +#endif // Reset the player's state - if (player->m_iJoiningState == JOINED) + switch (player->m_iJoiningState) { + case JOINED: CSGameRules()->CheckWinConditions(); - } - else if (player->m_iJoiningState == PICKINGTEAM) + break; + + case PICKINGTEAM: { player->m_iJoiningState = GETINTOGAME; @@ -1471,6 +1476,8 @@ void EXT_FUNC __API_HOOK(HandleMenu_ChooseAppearance)(CBasePlayer *player, int s CSGameRules()->CheckWinConditions(); } } + break; + } } player->pev->body = 0; @@ -1713,7 +1720,6 @@ BOOL EXT_FUNC __API_HOOK(HandleMenu_ChooseTeam)(CBasePlayer *player, int slot) ) { int humanTeam = UNASSIGNED; - if (!Q_stricmp(humans_join_team.string, "CT")) { humanTeam = CT; @@ -1763,11 +1769,9 @@ BOOL EXT_FUNC __API_HOOK(HandleMenu_ChooseTeam)(CBasePlayer *player, int slot) player->pev->solid = SOLID_NOT; player->pev->movetype = MOVETYPE_NOCLIP; - player->pev->effects = EF_NODRAW; - player->pev->effects |= EF_NOINTERP; + player->pev->effects = (EF_NODRAW | EF_NOINTERP); player->pev->takedamage = DAMAGE_NO; player->pev->deadflag = DEAD_DEAD; - player->pev->velocity = g_vecZero; player->pev->punchangle = g_vecZero; player->m_bHasNightVision = false; @@ -1775,10 +1779,18 @@ BOOL EXT_FUNC __API_HOOK(HandleMenu_ChooseTeam)(CBasePlayer *player, int slot) player->m_fDeadTime = 0; player->has_disconnected = false; +#ifdef REGAMEDLL_ADD + player->m_iJoiningState = PICKINGTEAM; +#else + player->pev->velocity = g_vecZero; player->m_iJoiningState = GETINTOGAME; +#endif player->SendItemStatus(); +#ifndef REGAMEDLL_ADD SET_CLIENT_MAXSPEED(ENT(player->pev), 1); +#endif + SET_MODEL(ENT(player->pev), "models/player.mdl"); } @@ -2286,25 +2298,9 @@ BOOL HandleRadioAliasCommands(CBasePlayer *pPlayer, const char *pszCommand) return FALSE; } -bool EXT_FUNC InternalCommand(edict_t *pEntity, const char *cmd) { - return true; -} - -// Use CMD_ARGV, CMD_ARGV, and CMD_ARGC to get pointers the character string command. -void EXT_FUNC ClientCommand(edict_t *pEntity) +void EXT_FUNC InternalCommand(edict_t *pEntity, const char *pcmd, const char *parg1) { - const char *pcmd = CMD_ARGV_(0); const char *pstr = NULL; - - // Is the client spawned yet? - if (!pEntity->pvPrivateData) - return; - -#ifdef REGAMEDLL_API - if (!g_ReGameHookchains.m_InternalCommand.callChain(InternalCommand, pEntity, pcmd)) - return; -#endif - entvars_t *pev = &pEntity->v; CBasePlayer *player = GetClassPtr((CBasePlayer *)pev); @@ -2351,15 +2347,14 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) int iVoteID; int iVoteFail = 0; int iNumArgs = CMD_ARGC_(); - const char *pszArg1 = CMD_ARGV_(1); - int iVoteLength = Q_strlen(pszArg1); + int iVoteLength = Q_strlen(parg1); if (iNumArgs != 2 || iVoteLength <= 0 || iVoteLength > 6) { iVoteFail = 1; } - iVoteID = Q_atoi(pszArg1); + iVoteID = Q_atoi(parg1); if (iVoteID <= 0) { iVoteFail = 1; @@ -2439,15 +2434,14 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) int iFailed = 0; int iNumArgs = CMD_ARGC_(); - const char *pszArg1 = CMD_ARGV_(1); - int iVoteLength = Q_strlen(pszArg1); + int iVoteLength = Q_strlen(parg1); if (iNumArgs != 2 || iVoteLength > 5) { iFailed = 1; } - int iVoteID = Q_atoi(pszArg1); + int iVoteID = Q_atoi(parg1); if (iVoteID < 1 || iVoteID > MAX_VOTE_MAPS) { iFailed = 1; @@ -2560,7 +2554,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) } else if (FStrEq(pcmd, "menuselect")) { - int slot = Q_atoi(CMD_ARGV_(1)); + int slot = Q_atoi(parg1); if (player->m_iJoiningState == JOINED || (player->m_iMenu != Menu_ChooseAppearance && player->m_iMenu != Menu_ChooseTeam)) { if (slot == 10) @@ -2901,8 +2895,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) else if (FStrEq(pcmd, "specmode")) { // new spectator mode - int mode = Q_atoi(CMD_ARGV_(1)); - + int mode = Q_atoi(parg1); if (player->IsObserver() && player->CanSwitchObserverModes()) player->Observer_SetMode(mode); else @@ -2916,14 +2909,13 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) } else if (FStrEq(pcmd, "spec_set_ad")) { - float val = Q_atof(CMD_ARGV_(1)); + float val = Q_atof(parg1); player->SetObserverAutoDirector(val > 0.0f); } else if (FStrEq(pcmd, "follownext")) { // follow next player - int arg = Q_atoi(CMD_ARGV_(1)); - + int arg = Q_atoi(parg1); if (player->IsObserver() && player->CanSwitchObserverModes()) { player->Observer_FindNextPlayer(arg != 0); @@ -2933,7 +2925,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) { if (player->IsObserver() && player->CanSwitchObserverModes()) { - player->Observer_FindNextPlayer(false, CMD_ARGV_(1)); + player->Observer_FindNextPlayer(false, parg1); } } else @@ -2949,7 +2941,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) if (FStrEq(pcmd, "mp_debug")) { - UTIL_SetDprintfFlags(CMD_ARGV_(1)); + UTIL_SetDprintfFlags(parg1); } else if (FStrEq(pcmd, "jointeam")) { @@ -2959,12 +2951,16 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) return; } - int slot = Q_atoi(CMD_ARGV_(1)); + int slot = Q_atoi(parg1); if (HandleMenu_ChooseTeam(player, slot)) { if (slot == MENU_SLOT_TEAM_VIP || slot == MENU_SLOT_TEAM_SPECT || player->m_bIsVIP) { +#ifdef REGAMEDLL_FIXES + player->ResetMenu(); +#else player->m_iMenu = Menu_OFF; +#endif } else player->m_iMenu = Menu_ChooseAppearance; @@ -2980,8 +2976,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) } else if (FStrEq(pcmd, "joinclass")) { - int slot = Q_atoi(CMD_ARGV_(1)); - + int slot = Q_atoi(parg1); if (player->m_iMenu != Menu_ChooseAppearance) { ClientPrint(player->pev, HUD_PRINTCENTER, "#Command_Not_Available"); @@ -3082,7 +3077,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) player->DropShield(); } else - player->DropPlayerItem(CMD_ARGV_(1)); + player->DropPlayerItem(parg1); } else if (FStrEq(pcmd, "fov")) { @@ -3095,7 +3090,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) } else if (FStrEq(pcmd, "use")) { - GetClassPtr((CBasePlayer *)pev)->SelectItem(CMD_ARGV_(1)); + GetClassPtr((CBasePlayer *)pev)->SelectItem(parg1); } else if (((pstr = Q_strstr(pcmd, "weapon_"))) && (pstr == pcmd)) { @@ -3184,7 +3179,7 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) { if (CMD_ARGC_() == 2) { - player->InitRebuyData(CMD_ARGV_(1)); + player->InitRebuyData(parg1); bool oldval = g_bClientPrintEnable; g_bClientPrintEnable = false; @@ -3242,6 +3237,19 @@ void EXT_FUNC ClientCommand(edict_t *pEntity) } } +// Use CMD_ARGV, CMD_ARGV, and CMD_ARGC to get pointers the character string command. +void EXT_FUNC ClientCommand_(edict_t *pEntity) +{ + const char *pcmd = CMD_ARGV_(0); + const char *parg1 = CMD_ARGV_(1); + + // Is the client spawned yet? + if (!pEntity->pvPrivateData) + return; + + g_ReGameHookchains.m_InternalCommand.callChain(InternalCommand, pEntity, pcmd, parg1); +} + // called after the player changes userinfo - gives dll a chance to modify it before it gets sent into the rest of the engine. void EXT_FUNC ClientUserInfoChanged(edict_t *pEntity, char *infobuffer) { @@ -3252,7 +3260,7 @@ void EXT_FUNC ClientUserInfoChanged(edict_t *pEntity, char *infobuffer) CBasePlayer *pPlayer = CBasePlayer::Instance(pEntity); char *szBufferName = GET_KEY_VALUE(infobuffer, "name"); - // msg everyone if someone changes their name, and it isn't the first time (changing no name to current name) + // msg everyone if someone changes their name, and it isn't the first time (changing no name to current name) if (pEntity->v.netname && STRING(pEntity->v.netname)[0] != '\0' && !FStrEq(STRING(pEntity->v.netname), szBufferName)) { char szName[32]; @@ -4239,7 +4247,7 @@ void Entity_Encode(struct delta_s *pFields, const unsigned char *from, const uns t = (entity_state_t *)to; // Never send origin to local player, it's sent with more resolution in clientdata_t structure - localplayer = (t->number - 1) == ENGINE_CURRENT_PLAYER(); + localplayer = (t->number - 1) == ENGINE_CURRENT_PLAYER(); if (localplayer) { @@ -4295,7 +4303,7 @@ void Player_Encode(struct delta_s *pFields, const unsigned char *from, const uns t = (entity_state_t *)to; // Never send origin to local player, it's sent with more resolution in clientdata_t structure - localplayer = (t->number - 1) == ENGINE_CURRENT_PLAYER(); + localplayer = (t->number - 1) == ENGINE_CURRENT_PLAYER(); if (localplayer) { diff --git a/regamedll/dlls/client.h b/regamedll/dlls/client.h index 1a5cf94d..57758cc1 100644 --- a/regamedll/dlls/client.h +++ b/regamedll/dlls/client.h @@ -153,7 +153,7 @@ CBaseEntity *EntityFromUserID(int userID); int CountPlayersInServer(); BOOL HandleBuyAliasCommands(CBasePlayer *pPlayer, const char *pszCommand); BOOL HandleRadioAliasCommands(CBasePlayer *pPlayer, const char *pszCommand); -void ClientCommand(edict_t *pEntity); +void ClientCommand_(edict_t *pEntity); void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer); void ServerDeactivate(); void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); @@ -197,14 +197,10 @@ inline const char *GetTeamName(int team) { switch (team) { - case CT: - return "CT"; - case TERRORIST: - return "TERRORIST"; - case SPECTATOR: - return "SPECTATOR"; - default: - return "UNASSIGNED"; + case CT: return "CT"; + case TERRORIST: return "TERRORIST"; + case SPECTATOR: return "SPECTATOR"; + default: return "UNASSIGNED"; } } diff --git a/regamedll/dlls/effects.cpp b/regamedll/dlls/effects.cpp index ea62a8da..40b83a9c 100644 --- a/regamedll/dlls/effects.cpp +++ b/regamedll/dlls/effects.cpp @@ -1973,8 +1973,14 @@ void CItemSoda::CanTouch(CBaseEntity *pOther) return; #endif +#ifdef REGAMEDLL_FIXES // spoit sound here - pPlayer->TakeHealth(1, DMG_GENERIC); // a bit of health. + // if we can't take hp, go out + if (!pPlayer->TakeHealth(1, DMG_GENERIC)) // a bit of health. + return; +#else + pPlayer->TakeHealth(1, DMG_GENERIC); +#endif if (!FNullEnt(pev->owner)) { diff --git a/regamedll/dlls/func_break.cpp b/regamedll/dlls/func_break.cpp index c17c39b9..7761caa5 100644 --- a/regamedll/dlls/func_break.cpp +++ b/regamedll/dlls/func_break.cpp @@ -381,7 +381,7 @@ void CBreakable::__MAKE_VHOOK(Precache)() pGibName = STRING(m_iszGibModel); } - if (pGibName != NULL) + if (pGibName) { m_idShard = PRECACHE_MODEL((char *)pGibName); } @@ -693,7 +693,7 @@ void CBreakable::Die() } cFlag = BREAK_GLASS; - if (TheBots != NULL) + if (TheBots) { TheBots->OnEvent(EVENT_BREAK_GLASS, this); } @@ -708,7 +708,7 @@ void CBreakable::Die() } cFlag = BREAK_WOOD; - if (TheBots != NULL) + if (TheBots) { TheBots->OnEvent(EVENT_BREAK_WOOD, this); } @@ -725,7 +725,7 @@ void CBreakable::Die() } cFlag = BREAK_METAL; - if (TheBots != NULL) + if (TheBots) { TheBots->OnEvent(EVENT_BREAK_METAL, this); } @@ -741,7 +741,7 @@ void CBreakable::Die() } cFlag = BREAK_FLESH; - if (TheBots != NULL) + if (TheBots) { TheBots->OnEvent(EVENT_BREAK_FLESH, this); } @@ -758,7 +758,7 @@ void CBreakable::Die() } cFlag = BREAK_CONCRETE; - if (TheBots != NULL) + if (TheBots) { TheBots->OnEvent(EVENT_BREAK_CONCRETE, this); } diff --git a/regamedll/dlls/gamerules.h b/regamedll/dlls/gamerules.h index 448de431..50852e7d 100644 --- a/regamedll/dlls/gamerules.h +++ b/regamedll/dlls/gamerules.h @@ -767,7 +767,6 @@ public: // has a style of gameplay when aren't any teams bool IsFreeForAll() const; - bool HasRoundInfinite(int flags = 0) const; VFUNC bool HasRoundTimeExpired(); VFUNC bool IsBombPlanted(); @@ -946,7 +945,7 @@ inline bool CHalfLifeMultiplay::IsFreeForAll() const return false; } -inline bool CHalfLifeMultiplay::HasRoundInfinite(int flags) const +inline bool HasRoundInfinite(int flags = 0) { #ifdef REGAMEDLL_ADD if (round_infinite.string[0] == '1') @@ -967,7 +966,7 @@ void SV_Career_EndRound_f(); void SV_CareerAddTask_f(); void SV_CareerMatchLimit_f(); void Broadcast(const char *sentence); -char *GetTeam(int teamNo); +char *GetTeam(int team); void EndRoundMessage(const char *sentence, int event); void DestroyMapCycle(mapcycle_t *cycle); diff --git a/regamedll/dlls/hostage/hostage.cpp b/regamedll/dlls/hostage/hostage.cpp index 2f3c972c..af40aefd 100644 --- a/regamedll/dlls/hostage/hostage.cpp +++ b/regamedll/dlls/hostage/hostage.cpp @@ -580,32 +580,33 @@ void CHostage::TraceAttack(entvars_t *pevAttacker, float flDamage, Vector vecDir BOOL CHostage::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { - float flActualDamage; - CBasePlayer *pAttacker = NULL; +#ifdef REGAMEDLL_ADD + if (hostagehurtable.value <= 0) + return FALSE; +#endif - flActualDamage = GetModifiedDamage(flDamage, m_LastHitGroup); + float flActualDamage = GetModifiedDamage(flDamage, m_LastHitGroup); if (flActualDamage > pev->health) flActualDamage = pev->health; pev->health -= flActualDamage; - if (m_improv != NULL) + if (m_improv) { m_improv->OnInjury(flActualDamage); } PlayPainSound(); - if (pevAttacker != NULL) + CBasePlayer *pAttacker = NULL; + if (pevAttacker) { CBaseEntity *pAttackingEnt = GetClassPtr((CBaseEntity *)pevAttacker); - if (pAttackingEnt->Classify() == CLASS_VEHICLE) { CBaseEntity *pDriver = ((CFuncVehicle *)pAttackingEnt)->m_pDriver; - - if (pDriver != NULL) + if (pDriver) { pevAttacker = pDriver->pev; } @@ -622,11 +623,11 @@ BOOL CHostage::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevA m_flFlinchTime = gpGlobals->time + 0.75f; SetFlinchActivity(); - if (pAttacker != NULL) + if (pAttacker) { pAttacker->AddAccount(-20 * int(flActualDamage), RT_HOSTAGE_DAMAGED); - if (TheBots != NULL) + if (TheBots) { TheBots->OnEvent(EVENT_HOSTAGE_DAMAGED, this, pAttacker); } @@ -659,12 +660,12 @@ BOOL CHostage::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevA pev->deadflag = DEAD_DEAD; pev->solid = SOLID_NOT; - if (TheBots != NULL) + if (TheBots) { TheBots->OnEvent(EVENT_HOSTAGE_KILLED, this, pAttacker); } - if (m_improv != NULL) + if (m_improv) { m_improv->Chatter(HOSTAGE_CHATTER_DEATH_CRY); } diff --git a/regamedll/dlls/items.cpp b/regamedll/dlls/items.cpp index efed8ea9..838746bf 100644 --- a/regamedll/dlls/items.cpp +++ b/regamedll/dlls/items.cpp @@ -79,7 +79,7 @@ void CWorldItem::__MAKE_VHOOK(Spawn)() break; } - if (pEntity != NULL) + if (pEntity) { pEntity->pev->target = pev->target; pEntity->pev->targetname = pev->targetname; @@ -369,7 +369,7 @@ BOOL CItemKevlar::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) WRITE_BYTE(0); MESSAGE_END(); - if (TheTutor != NULL) + if (TheTutor) { TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); } @@ -411,7 +411,7 @@ BOOL CItemAssaultSuit::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) WRITE_BYTE(1); MESSAGE_END(); - if (TheTutor != NULL) + if (TheTutor) { TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); } @@ -459,7 +459,7 @@ BOOL CItemThighPack::__MAKE_VHOOK(MyTouch)(CBasePlayer *pPlayer) pPlayer->SendItemStatus(); EMIT_SOUND(pPlayer->edict(), CHAN_VOICE, "items/kevlar.wav", VOL_NORM, ATTN_NORM); - if (TheTutor != NULL) + if (TheTutor) { TheTutor->OnEvent(EVENT_PLAYER_BOUGHT_SOMETHING, pPlayer); } diff --git a/regamedll/dlls/multiplay_gamerules.cpp b/regamedll/dlls/multiplay_gamerules.cpp index 60d69a58..ffce26f9 100644 --- a/regamedll/dlls/multiplay_gamerules.cpp +++ b/regamedll/dlls/multiplay_gamerules.cpp @@ -239,78 +239,78 @@ void Broadcast(const char *sentence) MESSAGE_END(); } -char *GetTeam(int teamNo) +char *GetTeam(int team) { - switch (teamNo) + switch (team) { - case TERRORIST: - return "TERRORIST"; - case CT: - return "CT"; - case SPECTATOR: - return "SPECTATOR"; - default: - break; + case CT: return "CT"; + case TERRORIST: return "TERRORIST"; + case SPECTATOR: return "SPECTATOR"; + default: return ""; } - - return ""; } void CHalfLifeMultiplay::EndRoundMessage(const char *sentence, int event) { char *team = NULL; - const char *message = &(sentence[1]); + const char *message = sentence; bool bTeamTriggered = true; - UTIL_ClientPrintAll(HUD_PRINTCENTER, sentence); + if (sentence[0] == '#') + message = sentence + 1; - switch (event) + if (sentence[0]) { - case ROUND_TARGET_BOMB: - case ROUND_VIP_ASSASSINATED: - case ROUND_TERRORISTS_ESCAPED: - case ROUND_TERRORISTS_WIN: - case ROUND_HOSTAGE_NOT_RESCUED: - case ROUND_VIP_NOT_ESCAPED: - team = GetTeam(TERRORIST); - // tell bots the terrorists won the round - if (TheBots) - { - TheBots->OnEvent(EVENT_TERRORISTS_WIN); - } - break; - case ROUND_VIP_ESCAPED: - case ROUND_CTS_PREVENT_ESCAPE: - case ROUND_ESCAPING_TERRORISTS_NEUTRALIZED: - case ROUND_BOMB_DEFUSED: - case ROUND_CTS_WIN: - case ROUND_ALL_HOSTAGES_RESCUED: - case ROUND_TARGET_SAVED: - case ROUND_TERRORISTS_NOT_ESCAPED: - team = GetTeam(CT); - // tell bots the CTs won the round - if (TheBots) - { - TheBots->OnEvent(EVENT_CTS_WIN); - } - break; - default: - bTeamTriggered = false; - // tell bots the round was a draw - if (TheBots) - { - TheBots->OnEvent(EVENT_ROUND_DRAW); - } - break; - } + UTIL_ClientPrintAll(HUD_PRINTCENTER, sentence); - if (bTeamTriggered) - { - UTIL_LogPrintf("Team \"%s\" triggered \"%s\" (CT \"%i\") (T \"%i\")\n", team, message, m_iNumCTWins, m_iNumTerroristWins); - } - else - { - UTIL_LogPrintf("World triggered \"%s\" (CT \"%i\") (T \"%i\")\n", message, m_iNumCTWins, m_iNumTerroristWins); + switch (event) + { + case ROUND_TARGET_BOMB: + case ROUND_VIP_ASSASSINATED: + case ROUND_TERRORISTS_ESCAPED: + case ROUND_TERRORISTS_WIN: + case ROUND_HOSTAGE_NOT_RESCUED: + case ROUND_VIP_NOT_ESCAPED: + team = GetTeam(TERRORIST); + // tell bots the terrorists won the round + if (TheBots) + { + TheBots->OnEvent(EVENT_TERRORISTS_WIN); + } + break; + case ROUND_VIP_ESCAPED: + case ROUND_CTS_PREVENT_ESCAPE: + case ROUND_ESCAPING_TERRORISTS_NEUTRALIZED: + case ROUND_BOMB_DEFUSED: + case ROUND_CTS_WIN: + case ROUND_ALL_HOSTAGES_RESCUED: + case ROUND_TARGET_SAVED: + case ROUND_TERRORISTS_NOT_ESCAPED: + team = GetTeam(CT); + // tell bots the CTs won the round + if (TheBots) + { + TheBots->OnEvent(EVENT_CTS_WIN); + } + break; + default: + bTeamTriggered = false; + // tell bots the round was a draw + if (TheBots) + { + TheBots->OnEvent(EVENT_ROUND_DRAW); + } + break; + } + + if (bTeamTriggered) + { + UTIL_LogPrintf("Team \"%s\" triggered \"%s\" (CT \"%i\") (T \"%i\")\n", team, message, m_iNumCTWins, m_iNumTerroristWins); + } + else + { + UTIL_LogPrintf("World triggered \"%s\" (CT \"%i\") (T \"%i\")\n", message, m_iNumCTWins, m_iNumTerroristWins); + } } UTIL_LogPrintf("World triggered \"Round_End\"\n"); @@ -1681,9 +1681,12 @@ void EXT_FUNC CHalfLifeMultiplay::__API_VHOOK(RestartRound)() g_pHostages->RestartRound(); } -#ifndef REGAMEDLL_FIXES - ++m_iTotalRoundsPlayed; +#ifdef REGAMEDLL_FIXES + if (!m_bCompleteReset) #endif + { + ++m_iTotalRoundsPlayed; + } ClearBodyQue(); @@ -1752,7 +1755,7 @@ void EXT_FUNC CHalfLifeMultiplay::__API_VHOOK(RestartRound)() UTIL_ClientPrintAll(HUD_PRINTCENTER, "#Auto_Team_Balance_Next_Round"); } #ifdef REGAMEDLL_ADD - else if (autoteambalance.value > 1 && m_iUnBalancedRounds >= 1) + else if (autoteambalance.value >= 2 && m_iUnBalancedRounds >= 1) { BalanceTeams(); } @@ -1813,12 +1816,6 @@ void EXT_FUNC CHalfLifeMultiplay::__API_VHOOK(RestartRound)() TheBots->OnEvent(EVENT_NEW_MATCH); } } -#ifdef REGAMEDLL_FIXES - else - { - m_iTotalRoundsPlayed++; - } -#endif m_bFreezePeriod = TRUE; m_bRoundTerminating = false; @@ -3638,20 +3635,19 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerThink)(CBasePlayer *pPlayer) if (pPlayer->m_iMenu != Menu_ChooseTeam && pPlayer->m_iJoiningState == SHOWTEAMSELECT) { - int team = MENU_SLOT_TEAM_UNDEFINED; - + int slot = MENU_SLOT_TEAM_UNDEFINED; if (!Q_stricmp(humans_join_team.string, "T")) { - team = MENU_SLOT_TEAM_TERRORIST; + slot = MENU_SLOT_TEAM_TERRORIST; } else if (!Q_stricmp(humans_join_team.string, "CT")) { - team = MENU_SLOT_TEAM_CT; + slot = MENU_SLOT_TEAM_CT; } #ifdef REGAMEDLL_ADD else if (!Q_stricmp(humans_join_team.string, "any") && auto_join_team.value != 0.0f) { - team = MENU_SLOT_TEAM_RANDOM; + slot = MENU_SLOT_TEAM_RANDOM; } #endif else @@ -3665,22 +3661,33 @@ void CHalfLifeMultiplay::__MAKE_VHOOK(PlayerThink)(CBasePlayer *pPlayer) pPlayer->m_iMenu = Menu_ChooseTeam; pPlayer->m_iJoiningState = PICKINGTEAM; - if (team != MENU_SLOT_TEAM_UNDEFINED && !pPlayer->IsBot()) + if (slot != MENU_SLOT_TEAM_UNDEFINED && !pPlayer->IsBot()) { #ifdef REGAMEDLL_ADD - m_bSkipShowMenu = (auto_join_team.value != 0.0f); - HandleMenu_ChooseTeam(pPlayer, team); + m_bSkipShowMenu = (auto_join_team.value != 0.0f) && !(pPlayer->pev->flags & FL_FAKECLIENT); - if (team != MENU_SLOT_TEAM_SPECT && (IsCareer() || m_bSkipShowMenu)) + if (HandleMenu_ChooseTeam(pPlayer, slot)) { - // slot 6 - chooses randomize the appearance to model player - HandleMenu_ChooseAppearance(pPlayer, 6); + if (slot != MENU_SLOT_TEAM_SPECT && (IsCareer() || m_bSkipShowMenu)) + { + // slot 6 - chooses randomize the appearance to model player + HandleMenu_ChooseAppearance(pPlayer, 6); + } } + else + { + m_bSkipShowMenu = false; + if (allow_spectators.value == 0.0f) + ShowVGUIMenu(pPlayer, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5), "#Team_Select"); + else + ShowVGUIMenu(pPlayer, VGUI_Menu_Team, (MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_6), "#Team_Select_Spect"); + } + m_bSkipShowMenu = false; #else - HandleMenu_ChooseTeam(pPlayer, team); + HandleMenu_ChooseTeam(pPlayer, slot); - if (team != MENU_SLOT_TEAM_SPECT && IsCareer()) + if (slot != MENU_SLOT_TEAM_SPECT && IsCareer()) { // slot 6 - chooses randomize the appearance to model player HandleMenu_ChooseAppearance(pPlayer, 6); @@ -3709,45 +3716,45 @@ LINK_HOOK_CLASS_CUSTOM_CHAIN(BOOL, CHalfLifeMultiplay, CSGameRules, FPlayerCanRe BOOL EXT_FUNC CHalfLifeMultiplay::__API_VHOOK(FPlayerCanRespawn)(CBasePlayer *pPlayer) { #ifdef REGAMEDLL_ADD - if (forcerespawn.value) - return TRUE; + if (forcerespawn.value <= 0) #endif - - // Player cannot respawn twice in a round - if (pPlayer->m_iNumSpawns > 0) { - return FALSE; - } - - // Player cannot respawn until next round if more than 20 seconds in - - // Tabulate the number of players on each team. - m_iNumCT = CountTeamPlayers(CT); - m_iNumTerrorist = CountTeamPlayers(TERRORIST); - - if (m_iNumTerrorist > 0 && m_iNumCT > 0) - { -#ifdef REGAMEDLL_ADD - // means no time limit - if (GetRoundRespawnTime() != -1) -#endif + // Player cannot respawn twice in a round + if (pPlayer->m_iNumSpawns > 0) { - // TODO: to be correct, need use time the real one starts of round, m_fRoundStartTimeReal instead of it. - // m_fRoundStartTime able to extend the time to 60 seconds when there is a remaining time of round. -#ifdef REGAMEDLL_FIXES - if (gpGlobals->time > m_fRoundStartTimeReal + GetRoundRespawnTime()) -#else - if (gpGlobals->time > m_fRoundStartTime + GetRoundRespawnTime()) + return FALSE; + } + + // Player cannot respawn until next round if more than 20 seconds in + + // Tabulate the number of players on each team. + m_iNumCT = CountTeamPlayers(CT); + m_iNumTerrorist = CountTeamPlayers(TERRORIST); + + if (m_iNumTerrorist > 0 && m_iNumCT > 0) + { +#ifdef REGAMEDLL_ADD + // means no time limit + if (GetRoundRespawnTime() != -1) #endif { - // If this player just connected and fadetoblack is on, then maybe - // the server admin doesn't want him peeking around. - if (fadetoblack.value != 0.0f) + // TODO: to be correct, need use time the real one starts of round, m_fRoundStartTimeReal instead of it. + // m_fRoundStartTime able to extend the time to 60 seconds when there is a remaining time of round. +#ifdef REGAMEDLL_FIXES + if (gpGlobals->time > m_fRoundStartTimeReal + GetRoundRespawnTime()) +#else + if (gpGlobals->time > m_fRoundStartTime + GetRoundRespawnTime()) +#endif { - UTIL_ScreenFade(pPlayer, Vector(0, 0, 0), 3, 3, 255, (FFADE_OUT | FFADE_STAYOUT)); - } + // If this player just connected and fadetoblack is on, then maybe + // the server admin doesn't want him peeking around. + if (fadetoblack.value != 0.0f) + { + UTIL_ScreenFade(pPlayer, Vector(0, 0, 0), 3, 3, 255, (FFADE_OUT | FFADE_STAYOUT)); + } - return FALSE; + return FALSE; + } } } } @@ -3763,7 +3770,7 @@ BOOL EXT_FUNC CHalfLifeMultiplay::__API_VHOOK(FPlayerCanRespawn)(CBasePlayer *pP float CHalfLifeMultiplay::__MAKE_VHOOK(FlPlayerSpawnTime)(CBasePlayer *pPlayer) { - return gpGlobals->time;//now! + return gpGlobals->time; } BOOL CHalfLifeMultiplay::__MAKE_VHOOK(AllowAutoTargetCrosshair)() diff --git a/regamedll/dlls/observer.cpp b/regamedll/dlls/observer.cpp index 08278d81..24336d68 100644 --- a/regamedll/dlls/observer.cpp +++ b/regamedll/dlls/observer.cpp @@ -504,3 +504,10 @@ void CBasePlayer::Observer_SetMode(int iMode) m_iObserverLastMode = iMode; m_bWasFollowing = false; } + +void CBasePlayer::Observer_Think() +{ + Observer_HandleButtons(); + Observer_CheckTarget(); + Observer_CheckProperties(); +} diff --git a/regamedll/dlls/player.cpp b/regamedll/dlls/player.cpp index 0c0462e8..281d9753 100644 --- a/regamedll/dlls/player.cpp +++ b/regamedll/dlls/player.cpp @@ -1013,8 +1013,7 @@ BOOL EXT_FUNC CBasePlayer::__API_VHOOK(TakeDamage)(entvars_t *pevInflictor, entv if (bitsDamageType & DMG_EXPLOSION) { CBaseEntity *temp = GetClassPtr((CBaseEntity *)pevInflictor); - - if (!Q_strcmp(STRING(temp->pev->classname), "grenade")) + if (FClassnameIs(temp->pev, "grenade")) { CGrenade *pGrenade = GetClassPtr((CGrenade *)pevInflictor); @@ -1161,7 +1160,7 @@ BOOL EXT_FUNC CBasePlayer::__API_VHOOK(TakeDamage)(entvars_t *pevInflictor, entv pAttacker = CBaseEntity::Instance(pevAttacker); - if (!g_pGameRules->FPlayerCanTakeDamage(this, pAttacker) && Q_strcmp("grenade", STRING(pevInflictor->classname)) != 0) + if (!g_pGameRules->FPlayerCanTakeDamage(this, pAttacker) && !FClassnameIs(pevInflictor, "grenade")) { // Refuse the damage return FALSE; @@ -2278,6 +2277,10 @@ void EXT_FUNC CBasePlayer::__API_VHOOK(Killed)(entvars_t *pevAttacker, int iGib) m_bIsDefusing = false; BuyZoneIcon_Clear(this); +#ifdef REGAMEDLL_ADD + CSPlayer()->m_flRespawnPending = gpGlobals->time; +#endif + SetThink(&CBasePlayer::PlayerDeathThink); pev->nextthink = gpGlobals->time + 0.1f; pev->solid = SOLID_NOT; @@ -2374,7 +2377,9 @@ void EXT_FUNC CBasePlayer::__API_HOOK(SetAnimation)(PLAYER_ANIM playerAnim) case PLAYER_DIE: { m_IdealActivity = ACT_DIESIMPLE; +#ifndef REGAMEDLL_FIXES DeathSound(); +#endif break; } case PLAYER_ATTACK1: @@ -3265,17 +3270,16 @@ void EXT_FUNC CBasePlayer::__API_HOOK(AddAccount)(int amount, RewardType type, b void CBasePlayer::ResetMenu() { +#ifdef REGAMEDLL_FIXES + m_iMenu = Menu_OFF; +#endif + MESSAGE_BEGIN(MSG_ONE, gmsgShowMenu, NULL, pev); WRITE_SHORT(0); WRITE_CHAR(0); WRITE_BYTE(0); WRITE_STRING(""); MESSAGE_END(); - -#ifdef REGAMEDLL_FIXES - m_iMenu = Menu_OFF; -#endif - } void CBasePlayer::SyncRoundTimer() @@ -3586,7 +3590,6 @@ void CBasePlayer::PlayerDeathThink() if (pev->flags & FL_ONGROUND) { float flForward = pev->velocity.Length() - 20; - if (flForward <= 0) pev->velocity = g_vecZero; else @@ -3632,16 +3635,13 @@ void CBasePlayer::PlayerDeathThink() { // if the player has been dead for one second longer than allowed by forcerespawn, // forcerespawn isn't on. Send the player off to an intermission camera until they choose to respawn. - if (g_pGameRules->IsMultiplayer()) + if (g_pGameRules->IsMultiplayer() && gpGlobals->time > m_fDeadTime + 3 && !(m_afPhysicsFlags & PFLAG_OBSERVER)) { - if (gpGlobals->time > m_fDeadTime + 3.0f && !(m_afPhysicsFlags & PFLAG_OBSERVER)) - { - // Send message to everybody to spawn a corpse. - SpawnClientSideCorpse(); + // Send message to everybody to spawn a corpse. + SpawnClientSideCorpse(); - // go to dead camera. - StartDeathCam(); - } + // go to dead camera. + StartDeathCam(); } } @@ -3650,17 +3650,16 @@ void CBasePlayer::PlayerDeathThink() { #ifdef REGAMEDLL_ADD // wait for any button down, or mp_forcerespawn is set and the respawn time is up - if (forcerespawn.value > 0 && (fAnyButtonDown || (gpGlobals->time > (m_fDeadTime + forcerespawn.value)))) + if (forcerespawn.value > 0 && gpGlobals->time > (m_fDeadTime + forcerespawn.value)) { respawn(pev, FALSE); pev->button = 0; pev->nextthink = -1; return; } -#else +#endif if (fAnyButtonDown) return; -#endif if (g_pGameRules->FPlayerCanRespawn(this)) { @@ -3709,13 +3708,8 @@ void EXT_FUNC CBasePlayer::__API_VHOOK(RoundRespawn)() pev->nextthink = -1; } - if (m_pActiveItem) - { - if (m_pActiveItem->iItemSlot() == GRENADE_SLOT) - { - SwitchWeapon(m_pActiveItem); - } - } + if (m_pActiveItem && m_pActiveItem->iItemSlot() == GRENADE_SLOT) + SwitchWeapon(m_pActiveItem); m_lastLocation[0] = '\0'; @@ -3732,6 +3726,10 @@ void EXT_FUNC CBasePlayer::__API_VHOOK(RoundRespawn)() // player off into observer mode void CBasePlayer::StartDeathCam() { +#ifdef REGAMEDLL_FXIES + m_canSwitchObserverModes = true; +#endif + if (pev->view_ofs == g_vecZero) { // don't accept subsequent attempts to StartDeathCam() @@ -4356,12 +4354,14 @@ void EXT_FUNC CBasePlayer::__API_VHOOK(PreThink)() else pev->flags &= ~FL_ONTRAIN; +#ifdef REGAMEDLL_ADD + PlayerRespawnThink(); +#endif + // Observer Button Handling if (IsObserver() && (m_afPhysicsFlags & PFLAG_OBSERVER)) { - Observer_HandleButtons(); - Observer_CheckTarget(); - Observer_CheckProperties(); + Observer_Think(); return; } @@ -4925,6 +4925,12 @@ void EXT_FUNC CBasePlayer::__API_VHOOK(PostThink)() StudioFrameAdvance(); CheckPowerups(); +#ifdef REGAMEDLL_ADD + if (m_flTimeStepSound) { + pev->flTimeStepSound = int(m_flTimeStepSound); + } +#endif + // NOTE: this is useless for CS 1.6 - s1lent #ifndef REGAMEDLL_FIXES UpdatePlayerSound(); @@ -8222,6 +8228,16 @@ int GetPlayerGaitsequence(const edict_t *pEdict) void CBasePlayer::SpawnClientSideCorpse() { +#ifdef REGAMEDLL_FIXES + // not allow to spawn, if the player was torn to gib + if (pev->effects & EF_NODRAW) + return; + + // do not make a corpse if the player goes to respawn. + if (pev->deadflag == DEAD_RESPAWNABLE) + return; +#endif + char *infobuffer = GET_INFO_BUFFER(edict()); char *pModel = GET_KEY_VALUE(infobuffer, "model"); @@ -8467,14 +8483,13 @@ void CBasePlayer::ClientCommand(const char *cmd, const char *arg1, const char *a UseBotArgs = true; auto pEntity = ENT(pev); - auto addr = &::ClientCommand; // NOTE: force __cdecl to allow cstrike amxx module to hook ClientCommand #if defined _MSC_VER || defined __INTEL_COMPILER __asm { - push pEntity; - call addr; + push pEntity + call ClientCommand_; add esp, 4; } #else @@ -8484,7 +8499,7 @@ void CBasePlayer::ClientCommand(const char *cmd, const char *arg1, const char *a "addl %%esp, $4\n\t" :: "g" (pEntity), - "g" (addr), + "g" (ClientCommand_), ); #endif // _MSC_VER || defined __INTEL_COMPILER @@ -9680,3 +9695,29 @@ bool EXT_FUNC CBasePlayer::__API_HOOK(GetIntoGame)() return true; } + +void CBasePlayer::PlayerRespawnThink() +{ +#ifdef REGAMEDLL_ADD + if (IsObserver() && (m_afPhysicsFlags & PFLAG_OBSERVER) && (m_iTeam == UNASSIGNED || m_iTeam == SPECTATOR)) + return; + + // Player cannot respawn while in the Choose Appearance menu + if (m_iMenu == Menu_ChooseAppearance || m_iJoiningState == SHOWTEAMSELECT) + return; + + if (pev->deadflag < DEAD_DYING) + return; + + if (forcerespawn.value) + { + if (gpGlobals->time > (CSPlayer()->m_flRespawnPending + forcerespawn.value)) + { + Spawn(); + pev->button = 0; + pev->nextthink = -1; + return; + } + } +#endif +} diff --git a/regamedll/dlls/player.h b/regamedll/dlls/player.h index 6c5347d2..9e6bcd9a 100644 --- a/regamedll/dlls/player.h +++ b/regamedll/dlls/player.h @@ -440,6 +440,7 @@ public: CBasePlayer *Observer_IsValidTarget_(int iPlayerIndex, bool bSameTeam); void Disconnect(); + void Observer_Think(); void Observer_HandleButtons(); void Observer_SetMode(int iMode); void Observer_CheckTarget(); @@ -527,6 +528,7 @@ public: void SendFOV(int fov); void WaterMove(); void EXPORT PlayerDeathThink(); + void PlayerRespawnThink(); void PlayerUse(); void HostageUsed(); void JoiningThink(); diff --git a/regamedll/dlls/util.h b/regamedll/dlls/util.h index d14f8751..1474932e 100644 --- a/regamedll/dlls/util.h +++ b/regamedll/dlls/util.h @@ -150,12 +150,10 @@ extern globalvars_t *gpGlobals; #define PLAYBACK_EVENT_DELAY(flags, who, index, delay)\ PLAYBACK_EVENT_FULL(flags, who, index, delay, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0) -#ifndef HOOK_GAMEDLL - +#if !defined(HOOK_GAMEDLL) #define __MAKE_VHOOK(fname)\ fname - -#endif +#endif // !defined(HOOK_GAMEDLL) && defined(REGAMEDLL_API) #define LINK_ENTITY_TO_CLASS(mapClassName, DLLClassName, DLLClassWrapName)\ C_DLLEXPORT void EXT_FUNC mapClassName(entvars_t *pev);\ diff --git a/regamedll/extra/cssdk/dlls/func_break.h b/regamedll/extra/cssdk/dlls/func_break.h index c1e9ddb0..51099d52 100644 --- a/regamedll/extra/cssdk/dlls/func_break.h +++ b/regamedll/extra/cssdk/dlls/func_break.h @@ -105,7 +105,7 @@ public: virtual void KeyValue(KeyValueData *pkvd) = 0; virtual int Save(CSave &save) = 0; virtual int Restore(CRestore &restore) = 0; - virtual int ObjectCaps() = 0 + virtual int ObjectCaps() = 0; virtual BOOL TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) = 0; virtual void Touch(CBaseEntity *pOther) = 0; virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) = 0; diff --git a/regamedll/game_shared/bot/bot.cpp b/regamedll/game_shared/bot/bot.cpp index 4a371f9f..ff36922b 100644 --- a/regamedll/game_shared/bot/bot.cpp +++ b/regamedll/game_shared/bot/bot.cpp @@ -325,7 +325,7 @@ void CBot::ClientCommand(const char *cmd, const char *arg1, const char *arg2, co BotArgs[3] = arg3; UseBotArgs = true; - ::ClientCommand(ENT(pev)); + ::ClientCommand_(ENT(pev)); UseBotArgs = false; } #endif diff --git a/regamedll/game_shared/bot/nav_file.cpp b/regamedll/game_shared/bot/nav_file.cpp index 5da24794..478cef8e 100644 --- a/regamedll/game_shared/bot/nav_file.cpp +++ b/regamedll/game_shared/bot/nav_file.cpp @@ -69,7 +69,6 @@ Place PlaceDirectory::EntryToPlace(EntryType entry) const return UNDEFINED_PLACE; unsigned int i = entry - 1; - if (i > m_directory.size()) { assert(false && "PlaceDirectory::EntryToPlace: Invalid entry"); @@ -705,7 +704,7 @@ void LoadLocationFile(const char *filename) Q_strcpy(locFilename, filename); char *dot = Q_strchr(locFilename, '.'); - if (dot != NULL) + if (dot) { Q_strcpy(dot, ".loc"); @@ -713,7 +712,7 @@ void LoadLocationFile(const char *filename) char *locDataFile = (char *)LOAD_FILE_FOR_ME(const_cast(locFilename), &locDataLength); char *locData = locDataFile; - if (locData != NULL) + if (locData) { CONSOLE_ECHO("Loading legacy 'location file' '%s'\n", locFilename); @@ -748,7 +747,7 @@ void LoadLocationFile(const char *filename) CNavArea *area = TheNavAreaGrid.GetNavAreaByID(areaID); unsigned int place = (locDirIndex > 0) ? directory[locDirIndex - 1] : UNDEFINED_PLACE; - if (area != NULL) + if (area) area->SetPlace(place); } } @@ -880,7 +879,6 @@ NavErrorType LoadNavigationMap() return NAV_INVALID_FILE; unsigned int bspSize = (unsigned int)GET_FILE_SIZE(bspFilename); - if (bspSize != saveBspSize) { // this nav file is out of date for this bsp file diff --git a/regamedll/hookers/hooker_impl.h b/regamedll/hookers/hooker_impl.h index ee991161..65dd3ae8 100644 --- a/regamedll/hookers/hooker_impl.h +++ b/regamedll/hookers/hooker_impl.h @@ -90,6 +90,7 @@ typedef float FloatRef; #define LINK_HOOK_CLASS_CUSTOM_CHAIN(...) #define LINK_HOOK_CLASS_CUSTOM_CHAIN2(...) #define LINK_HOOK_VOID_CHAIN(...) +#define LINK_HOOK_VOID_CHAIN2(...) #define LINK_HOOK_CHAIN(...) #define LINK_HOOK_CHAIN2(...) diff --git a/regamedll/msvc/PreBuild.bat b/regamedll/msvc/PreBuild.bat index a950c492..7d6501cd 100644 --- a/regamedll/msvc/PreBuild.bat +++ b/regamedll/msvc/PreBuild.bat @@ -127,10 +127,10 @@ IF NOT %errlvl% == "1" ( ) :: append extra string - If NOT "%commitURL%"=="%commitURL:bitbucket.org=%" ( - set commitURL=!commitURL!/commit/ - ) ELSE ( + If NOT "!commitURL!"=="!commitURL:bitbucket.org=!" ( set commitURL=!commitURL!/commits/ + ) ELSE ( + set commitURL=!commitURL!/commit/ ) ) ELSE ( @@ -142,10 +142,10 @@ IF NOT %errlvl% == "1" ( set commitURL=!commitURL::=/! :: append extra string - If NOT "%commitURL%"=="%commitURL:bitbucket.org=%" ( - set commitURL=https://!commitURL!/commit/ - ) ELSE ( + If NOT "!commitURL!"=="!commitURL:bitbucket.org=!" ( set commitURL=https://!commitURL!/commits/ + ) ELSE ( + set commitURL=https://!commitURL!/commit/ ) ) ) diff --git a/regamedll/msvc/ReGameDLL.vcxproj b/regamedll/msvc/ReGameDLL.vcxproj index 88d29529..9dfd6dda 100644 --- a/regamedll/msvc/ReGameDLL.vcxproj +++ b/regamedll/msvc/ReGameDLL.vcxproj @@ -1417,7 +1417,7 @@ true - %(AdditionalDependencies) + $(ProjectDir)../lib/libacof32.lib;%(AdditionalDependencies) mp.def @@ -1459,7 +1459,7 @@ true - %(AdditionalDependencies) + $(ProjectDir)../lib/libacof32.lib;%(AdditionalDependencies) mp.def @@ -1619,7 +1619,7 @@ true true true - %(AdditionalDependencies) + $(ProjectDir)../lib/libacof32.lib;%(AdditionalDependencies) diff --git a/regamedll/pm_shared/pm_shared.cpp b/regamedll/pm_shared/pm_shared.cpp index f692241b..32fea661 100644 --- a/regamedll/pm_shared/pm_shared.cpp +++ b/regamedll/pm_shared/pm_shared.cpp @@ -488,7 +488,8 @@ void EXT_FUNC __API_HOOK(PM_UpdateStepSound)() if ((pmove->flags & FL_DUCKING) || fLadder) { - pmove->flTimeStepSound += 100; // slower step time if ducking + // slower step time if ducking + pmove->flTimeStepSound += 100; // play the sound // 35% volume if ducking diff --git a/regamedll/pm_shared/pm_shared.h b/regamedll/pm_shared/pm_shared.h index a92f71df..f8f7631a 100644 --- a/regamedll/pm_shared/pm_shared.h +++ b/regamedll/pm_shared/pm_shared.h @@ -83,7 +83,7 @@ char PM_FindTextureType(char *name); void PM_Init_(struct playermove_s *ppmove); void PM_Move_(struct playermove_s *ppmove, int server); -void PM_AirMove_(int playerIndex); +void PM_AirMove_(int playerIndex = 0); void PM_AirMove_internal(); void PM_UpdateStepSound_(); diff --git a/regamedll/public/regamedll/regamedll_api.h b/regamedll/public/regamedll/regamedll_api.h index c60cac47..8b6c6666 100644 --- a/regamedll/public/regamedll/regamedll_api.h +++ b/regamedll/public/regamedll/regamedll_api.h @@ -259,8 +259,8 @@ typedef IHookChain IReGa typedef IHookChainRegistry IReGameHookRegistry_BuyWeaponByWeaponID; // InternalCommand hook -typedef IHookChain IReGameHook_InternalCommand; -typedef IHookChainRegistry IReGameHookRegistry_InternalCommand; +typedef IHookChain IReGameHook_InternalCommand; +typedef IHookChainRegistry IReGameHookRegistry_InternalCommand; // CHalfLifeMultiplay::FShouldSwitchWeapon hook typedef IHookChain IReGameHook_CSGameRules_FShouldSwitchWeapon; diff --git a/regamedll/public/regamedll/regamedll_interfaces.h b/regamedll/public/regamedll/regamedll_interfaces.h index 38486f63..b0bf0853 100644 --- a/regamedll/public/regamedll/regamedll_interfaces.h +++ b/regamedll/public/regamedll/regamedll_interfaces.h @@ -51,7 +51,7 @@ class CCSArmoury: public CCSEntity {}; class CCSPlayer: public CCSMonster { public: - CCSPlayer() : m_bForceShowMenu(false) + CCSPlayer() : m_bForceShowMenu(false), m_flRespawnPending(0) { m_szModel[0] = '\0'; } @@ -100,6 +100,7 @@ public: public: char m_szModel[32]; bool m_bForceShowMenu; + float m_flRespawnPending; }; class CAPI_Bot: public CCSPlayer {}; diff --git a/regamedll/regamedll/regamedll_api_impl.h b/regamedll/regamedll/regamedll_api_impl.h index 49885eda..6bc121dc 100644 --- a/regamedll/regamedll/regamedll_api_impl.h +++ b/regamedll/regamedll/regamedll_api_impl.h @@ -255,8 +255,8 @@ typedef IHookChainImpl CReGameHook_B typedef IHookChainRegistryImpl CReGameHookRegistry_BuyWeaponByWeaponID; // InternalCommand hook -typedef IHookChainImpl CReGameHook_InternalCommand; -typedef IHookChainRegistryImpl CReGameHookRegistry_InternalCommand; +typedef IHookChainImpl CReGameHook_InternalCommand; +typedef IHookChainRegistryImpl CReGameHookRegistry_InternalCommand; // CHalfLifeMultiplay::FShouldSwitchWeapon hook typedef IHookChainClassImpl CReGameHook_CSGameRules_FShouldSwitchWeapon; diff --git a/regamedll/regamedll/regamedll_interfaces_impl.cpp b/regamedll/regamedll/regamedll_interfaces_impl.cpp index 42e8a2e3..f57b48e7 100644 --- a/regamedll/regamedll/regamedll_interfaces_impl.cpp +++ b/regamedll/regamedll/regamedll_interfaces_impl.cpp @@ -73,7 +73,7 @@ bool EXT_FUNC CCSPlayer::JoinTeam(TeamName team) case CT: case TERRORIST: { - if (pPlayer->m_iTeam == SPECTATOR) + if (pPlayer->m_iTeam == SPECTATOR || pPlayer->m_iTeam == UNASSIGNED) { // If they're switching into spectator, setup spectator properties.. pPlayer->m_bNotKilled = true; diff --git a/regamedll/regamedll/regamedll_interfaces_impl.h b/regamedll/regamedll/regamedll_interfaces_impl.h index 33c704b7..1f9c40e5 100644 --- a/regamedll/regamedll/regamedll_interfaces_impl.h +++ b/regamedll/regamedll/regamedll_interfaces_impl.h @@ -30,11 +30,11 @@ #include "maintypes.h" #include "regamedll_interfaces.h" +#if !defined(HOOK_GAMEDLL) && defined(REGAMEDLL_API) + #define __API_VHOOK(fname)\ fname##_ -#ifndef HOOK_GAMEDLL - #define __API_HOOK __API_VHOOK #define __MAKE_VHOOK(fname)\ fname @@ -94,5 +94,26 @@ ret functionName() {\ return g_ReGameHookchains.m_##functionName.callChain(functionName##_);\ } +#else -#endif +#define __API_VHOOK(fname)\ + fname + +#define __API_HOOK __API_VHOOK +#define __MAKE_VHOOK(fname)\ + fname + +#define LINK_HOOK_CLASS_VOID_CHAIN(...) +#define LINK_HOOK_CLASS_VOID_CHAIN2(...) +#define LINK_HOOK_CLASS_CHAIN(...) +#define LINK_HOOK_CLASS_CHAIN2(...) +#define LINK_HOOK_CLASS_VOID_CUSTOM_CHAIN(...) +#define LINK_HOOK_CLASS_VOID_CUSTOM_CHAIN2(...) +#define LINK_HOOK_CLASS_CUSTOM_CHAIN(...) +#define LINK_HOOK_CLASS_CUSTOM_CHAIN2(...) +#define LINK_HOOK_VOID_CHAIN(...) +#define LINK_HOOK_VOID_CHAIN2(...) +#define LINK_HOOK_CHAIN(...) +#define LINK_HOOK_CHAIN2(...) + +#endif // !defined(HOOK_GAMEDLL) && defined(REGAMEDLL_API)