Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,14 @@ jobs:
run: |
cd ambuild && python setup.py install && cd ..

- name: Install Clang 16
- name: Install Clang 21
if: matrix.os == 'ubuntu-latest'
run: |
apt update && apt install -y clang-16
ln -sf /usr/bin/clang-16 /usr/bin/clang && ln -sf /usr/bin/clang++-16 /usr/bin/clang++
echo "deb http://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-21 main" >> /etc/apt/sources.list.d/llvm.list
echo "deb-src http://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-21 main" >> /etc/apt/sources.list.d/llvm.list
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
apt update && apt install -y clang-21
ln -sf /usr/bin/clang-21 /usr/bin/clang && ln -sf /usr/bin/clang++-21 /usr/bin/clang++

- name: Build
working-directory: CS2Fixes
Expand Down
2 changes: 2 additions & 0 deletions AMBuilder
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ for sdk_target in MMSPlugin.sdk_targets:
'src/utils/entity.cpp',
'src/utils/weapon.cpp',
'src/utils/hud_manager.cpp',
'src/utils/utils.cpp',
'src/cs2_sdk/entity/services.cpp',
'src/cs2_sdk/entity/ccsplayerpawn.cpp',
'src/cs2_sdk/entity/cbasemodelentity.cpp',
Expand All @@ -69,6 +70,7 @@ for sdk_target in MMSPlugin.sdk_targets:
'src/entitylistener.cpp',
'src/leader.cpp',
'src/buttonwatch.cpp',
'src/topdefender.cpp',
'src/idlemanager.cpp',
'sdk/entity2/entitysystem.cpp',
'sdk/entity2/entityidentity.cpp',
Expand Down
4 changes: 4 additions & 0 deletions CS2Fixes.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@
<ClCompile Include="src\panoramavote.cpp" />
<ClCompile Include="src\patches.cpp" />
<ClCompile Include="src\playermanager.cpp" />
<ClCompile Include="src\topdefender.cpp" />
<ClCompile Include="src\user_preferences.cpp" />
<ClCompile Include="src\votemanager.cpp" />
<ClCompile Include="src\zombiereborn.cpp" />
Expand All @@ -218,6 +219,7 @@
<ClCompile Include="src\utils\plat_win.cpp" />
<ClCompile Include="src\utils\weapon.cpp" />
<ClCompile Include="src\utils\hud_manager.cpp" />
<ClCompile Include="src\utils\utils.cpp" />
<ClCompile Include="src\cs2_sdk\entity\services.cpp" />
<ClCompile Include="src\cs2_sdk\entity\ccsplayerpawn.cpp" />
<ClCompile Include="src\cs2_sdk\entity\cbasemodelentity.cpp" />
Expand Down Expand Up @@ -281,6 +283,7 @@
<ClInclude Include="src\recipientfilters.h" />
<ClInclude Include="src\cs2_sdk\serversideclient.h" />
<ClInclude Include="src\cs2_sdk\clientframe.h" />
<ClInclude Include="src\topdefender.h" />
<ClInclude Include="src\utils\plat_win.h" />
<ClInclude Include="src\votemanager.h" />
<ClInclude Include="src\map_votes.h" />
Expand All @@ -296,6 +299,7 @@
<ClInclude Include="src\utils\weapon.h" />
<ClInclude Include="src\utils\version_gen_placeholder.h" />
<ClInclude Include="src\utils\hud_manager.h" />
<ClInclude Include="src\utils\utils.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets" />
Expand Down
12 changes: 12 additions & 0 deletions CS2Fixes.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,9 @@
<ClCompile Include="src\utils\hud_manager.cpp">
<Filter>Source Files\utils</Filter>
</ClCompile>
<ClCompile Include="src\utils\utils.cpp">
<Filter>Source Files\utils</Filter>
</ClCompile>
<ClCompile Include="src\cs2_sdk\entity\services.cpp">
<Filter>Source Files\cs2_sdk\entity</Filter>
</ClCompile>
Expand All @@ -194,6 +197,9 @@
<ClCompile Include="src\cs2_sdk\entity\cbasemodelentity.cpp">
<Filter>Source Files\cs2_sdk\entity</Filter>
</ClCompile>
<ClCompile Include="src\topdefender.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\mempatch.h">
Expand Down Expand Up @@ -412,8 +418,14 @@
<ClInclude Include="src\utils\hud_manager.h">
<Filter>Header Files\utils</Filter>
</ClInclude>
<ClInclude Include="src\utils\utils.h">
<Filter>Header Files\utils</Filter>
</ClInclude>
<ClInclude Include="src\cs2_sdk\entity\cpointorient.h">
<Filter>Header Files\cs2_sdk\entity</Filter>
</ClInclude>
<ClInclude Include="src\topdefender.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
7 changes: 5 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ FROM registry.gitlab.steamos.cloud/steamrt/sniper/sdk

WORKDIR /app

RUN apt update && apt install -y clang-16
RUN ln -sf /usr/bin/clang-16 /usr/bin/clang && ln -sf /usr/bin/clang++-16 /usr/bin/clang++
RUN echo "deb http://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-21 main" >> /etc/apt/sources.list.d/llvm.list
RUN echo "deb-src http://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-21 main" >> /etc/apt/sources.list.d/llvm.list
RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
RUN apt update && apt install -y clang-21
RUN ln -sf /usr/bin/clang-21 /usr/bin/clang && ln -sf /usr/bin/clang++-21 /usr/bin/clang++
RUN git clone https://github.com/alliedmodders/ambuild
RUN cd ambuild && python setup.py install && cd ..
RUN git clone https://github.com/alliedmodders/metamod-source
Expand Down
35 changes: 22 additions & 13 deletions cfg/cs2fixes/cs2fixes.cfg
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
// Feature cvars
cs2f_commands_enable 0 // Whether to enable chat commands
cs2f_admin_commands_enable 0 // Whether to enable admin chat commands
cs2f_admin_immunity 0 // Mode for which admin immunity system targetting allows: 0 - strictly lower, 1 - equal to or lower, 2 - ignore immunity levels
cs2f_admin_immunity 0 // Mode for which admin immunity system targetting allows: 0 - strictly lower, 1 - equal to or lower, 2 - ignore immunity levels
cs2f_weapons_enable 0 // Whether to enable weapon commands
cs2f_stopsound_enable 0 // Whether to enable stopsound
cs2f_noblock_enable 0 // Whether to use player noblock, which sets debris collision on every player
cs2f_noblock_grenades 0 // Whether to use noblock on grenade projectiles
cs2f_topdefender_enable 0 // Whether to use TopDefender
cs2f_block_team_messages 0 // Whether to block team join messages
cs2f_movement_unlocker_enable 0 // Whether to enable movement unlocker
cs2f_use_old_push 0 // Whether to use the old CSGO trigger_push behavior (Necessary for surf and other modes that heavily use ported pushes)
Expand All @@ -27,10 +26,10 @@ cs2f_fix_game_bans 0 // Whether to fix CS2 game bans spreading to all new jo
cs2f_free_armor 0 // Whether kevlar (1+) and/or helmet (2) are given automatically

cs2f_beacon_particle "particles/cs2fixes/admin_beacon.vpcf" // .vpcf file to be precached and used for player beacon

cs2f_motd_url "" // Server MOTD URL, shows up as a "Server Website" button in scoreboard
cs2f_delay_auth_fail_kick 0 // How long in seconds to delay kicking players when their Steam authentication fails, use with sv_steamauth_enforce 0

//Screen Shake settings
// Screen Shake settings
cs2f_noshake_enable 0 // Whether to enable noshake command
cs2f_maximum_shake_amplitude -1 // Shaking Amplitude bigger than this will be clamped (0-16.0), -1 = no clamp

Expand Down Expand Up @@ -60,6 +59,15 @@ cs2f_hide_distance_default 250 // The default distance for hide
cs2f_hide_distance_max 2000 // The max distance for hide
cs2f_hide_teammates_only 0 // Whether to hide teammates only

// TopDefender settings
cs2f_topdefender_enable 0 // Whether to use TopDefender
cs2f_topdefender_scoreboard 0 // Whether to display defender rank on scoreboard as MVP count
cs2f_topdefender_print 1 // Whether to print defender stats to console at round end
cs2f_topdefender_score 5000 // Score given to the top defender
cs2f_topdefender_threshold 1000 // Damage threshold for Top Defenders to be shown on round end
cs2f_topdefender_rate 1.0 // How often TopDefender stats get updated
cs2f_topdefender_clantag "[Top Defender]" // Clan tag given to the top defender

// Chat flood settings
cs2f_flood_interval 0.75 // Amount of time allowed between chat messages acquiring flood tokens
cs2f_max_flood_tokens 3 // Maximum number of flood tokens allowed before chat messages are blocked
Expand All @@ -82,6 +90,7 @@ cs2f_rtv_endround 0 // Whether to immediately end the round when RTV succee

// Map vote settings
cs2f_vote_maps_cooldown 6.0 // Default number of hours until a map can be played again i.e. cooldown
cs2f_vote_maps_cooldown_rng 0.0 // Randomness range in both directions to apply to map cooldowns
cs2f_vote_max_nominations 10 // Number of nominations to include per vote, out of a maximum of 10
cs2f_vote_max_maps 10 // Number of total maps to include per vote, including nominations, out of a maximum of 10

Expand Down Expand Up @@ -122,16 +131,16 @@ cs2f_leader_actions_ct_only 1 // Whether to allow leader actions (like !beacon
cs2f_leader_marker_ct_only 1 // Whether to have zombie leaders' player_pings spawn in particle markers or not
cs2f_leader_mute_player_pings 1 // Whether to mute player pings made by non-leaders
cs2f_leader_model_path "" // Path to player model to be used for leaders
cs2f_leader_defend_particle "particles/cs2fixes/leader_defend_mark.vpcf" // Path to defend particle to be used with c_defend
cs2f_leader_mark_particle "particles/cs2fixes/leader_defend_mark.vpcf" // Path to particle to be used when a ct leader using player_ping
cs2f_leader_can_target_players 0 // Whether a leader can target other players with leader commands (not including c_leader)
cs2f_leader_vote_multiple 1 // If 1, players can vote up to cs2f_max_leaders leaders. If 0, they may vote for a single leader
cs2f_leader_defend_particle "particles/cs2fixes/leader_defend_mark.vpcf" // Path to defend particle to be used with c_defend
cs2f_leader_mark_particle "particles/cs2fixes/leader_defend_mark.vpcf" // Path to particle to be used when a ct leader using player_ping
cs2f_leader_can_target_players 0 // Whether a leader can target other players with leader commands (not including c_leader)
cs2f_leader_vote_multiple 1 // If 1, players can vote up to cs2f_max_leaders leaders. If 0, they may vote for a single leader
cs2f_leader_extra_score 20000 // Extra score to give a leader to affect their position on the scoreboard
cs2f_leader_max_leaders 3 // Max amount of leaders set via c_vl or a leader using c_leader (doesn't impact admins)
cs2f_leader_max_markers 6 // Max amount of markers set by leaders (doesn't impact admins)
cs2f_leader_max_glows 3 // Max amount of glows set by leaders (doesn't impact admins)
cs2f_leader_max_tracers 3 // Max amount of tracers set by leaders (doesn't impact admins)
cs2f_leader_max_beacons 3 // Max amount of beacons set by leaders (doesn't impact admins)
cs2f_leader_max_leaders 3 // Max amount of leaders set via c_vl or a leader using c_leader (doesn't impact admins)
cs2f_leader_max_markers 6 // Max amount of markers set by leaders (doesn't impact admins)
cs2f_leader_max_glows 3 // Max amount of glows set by leaders (doesn't impact admins)
cs2f_leader_max_tracers 3 // Max amount of tracers set by leaders (doesn't impact admins)
cs2f_leader_max_beacons 3 // Max amount of beacons set by leaders (doesn't impact admins)

// Idle Kick Settings
cs2f_idle_kick_time 0.0 // Amount of minutes before kicking idle players. 0 to disable afk kicking.
Expand Down
6 changes: 2 additions & 4 deletions src/adminsystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -594,11 +594,9 @@ CON_COMMAND_CHAT_FLAGS(rcon, "<command> - Send a command to server console", ADM
}

// Normally this should be done on plugin init, but for whatever reason "log_flags <channel> +donotecho" crashes AFTER this
ExecuteOnce
(
ExecuteOnce(
LoggingSystem_RegisterBackdoorLoggingListener(&g_LoggingListener);
LoggingSystem_EnableBackdoorLoggingListeners(true);
);
LoggingSystem_EnableBackdoorLoggingListeners(true););

// We don't have the equivalent of ServerExecute (to immediately execute commands) in source2, so manually find and execute the command

Expand Down
6 changes: 6 additions & 0 deletions src/commands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -744,6 +744,12 @@ CON_COMMAND_CHAT(showteam, "<name> - Get a player's current team")
}
}

// Because sv_fullupdate doesn't work
CON_COMMAND_F(cs2f_fullupdate, "- Force a full update for all clients.", FCVAR_LINKED_CONCOMMAND | FCVAR_SPONLY)
{
g_playerManager->FullUpdateAllClients();
}

#if _DEBUG
CON_COMMAND_CHAT(myuid, "- Test")
{
Expand Down
6 changes: 2 additions & 4 deletions src/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#pragma once

#include "platform.h"
#include "utils.h"

#define VPROF_LEVEL 1

Expand All @@ -44,7 +45,4 @@
#endif

void UnlockConVars();
void UnlockConCommands();

void Message(const char*, ...);
void Panic(const char*, ...);
void UnlockConCommands();
2 changes: 1 addition & 1 deletion src/cs2_sdk/entity/cbaseplayercontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class CBasePlayerController : public CBaseEntity

SCHEMA_FIELD(uint64, m_steamID)
SCHEMA_FIELD(CHandle<CBasePlayerPawn>, m_hPawn)
SCHEMA_FIELD_POINTER(char, m_iszPlayerName)
SCHEMA_FIELD_POINTER(char, m_iszPlayerName) // char m_iszPlayerName[128]
SCHEMA_FIELD(PlayerConnectedState, m_iConnected)
SCHEMA_FIELD(bool, m_bIsHLTV)
SCHEMA_FIELD(uint, m_iDesiredFOV)
Expand Down
11 changes: 11 additions & 0 deletions src/cs2_sdk/entity/cbaseplayerpawn.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,19 @@ class CBasePlayerPawn : public CBaseModelEntity
}
}

Vector pos = GetEyePosition();
for (CBasePlayerWeapon* pWeapon : vecWeaponsToDrop)
{
m_pWeaponServices()->DropWeapon(pWeapon);

CHandle<CBasePlayerWeapon> hWep = pWeapon->GetHandle();
CTimer::Create(0.0, TIMERFLAG_MAP | TIMERFLAG_ROUND, [hWep, pos] {
CBasePlayerWeapon* pWep = hWep.Get();
if (pWep)
pWep->Teleport(&pos, nullptr, nullptr);
return -1.0f;
});
}
}

void CommitSuicide(bool bExplode, bool bForce)
Expand Down
25 changes: 24 additions & 1 deletion src/cs2_sdk/entity/ccsplayercontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ class CCSPlayerController : public CBasePlayerController
SCHEMA_FIELD(CCSPlayerController_ActionTrackingServices*, m_pActionTrackingServices)
SCHEMA_FIELD(uint32_t, m_iPing)
SCHEMA_FIELD(CUtlSymbolLarge, m_szClan)
SCHEMA_FIELD_POINTER(char, m_szClanName) // char m_szClanName[32]
SCHEMA_FIELD(bool, m_bEverFullyConnected)
SCHEMA_FIELD(bool, m_bPawnIsAlive)
SCHEMA_FIELD(int32_t, m_nDisconnectionTick)
Expand All @@ -47,6 +46,10 @@ class CCSPlayerController : public CBasePlayerController
SCHEMA_FIELD(int32_t, m_iRoundsWon)
SCHEMA_FIELD(int32_t, m_iMVPs)
SCHEMA_FIELD(float, m_flSmoothedPing)
SCHEMA_FIELD(bool, m_bMvpNoMusic)
SCHEMA_FIELD(int32_t, m_eMvpReason)
SCHEMA_FIELD(int32_t, m_iMusicKitID)
SCHEMA_FIELD(int32_t, m_iMusicKitMVPs)

static CCSPlayerController* FromPawn(CCSPlayerPawn* pawn)
{
Expand Down Expand Up @@ -144,4 +147,24 @@ class CCSPlayerController : public CBasePlayerController
{
m_iScore() = m_iScore() + iScore;
}

void SetClanTag(const char* pszClanTag)
{
// Skip if clan tag is unchanged, since name swap trick has a bit of overhead
if (!V_strcmp(m_szClan().String(), pszClanTag))
return;

m_szClan = g_pEntitySystem->AllocPooledString(pszClanTag);

// This name swap trick is necessary to get clients to display the new clan tag
std::string strName = GetPlayerName();

if (!strName.empty() && strName.back() == ' ')
strName.pop_back();
else
strName.push_back(' ');

V_strncpy(m_iszPlayerName, strName.c_str(), 128);
m_iszPlayerName.NetworkStateChanged();
}
};
6 changes: 3 additions & 3 deletions src/cs2_sdk/entity/globaltypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,9 @@ struct EmitSound_t
{
}
const char* m_pSoundName; // 0x0
Vector m_vecSoundOrigin; // 0x8
float m_flVolume; // 0x14
float m_flSoundTime; // 0x18
Vector m_vecSoundOrigin; // 0x8
float m_flVolume; // 0x14
float m_flSoundTime; // 0x18
private:
uint8_t pad_1c[0x4];

Expand Down
Loading