Skip to content

Commit caf7394

Browse files
committed
feat(scripting/player/weapons): SetActiveWeapon
1 parent ccf7b18 commit caf7394

File tree

5 files changed

+53
-0
lines changed

5 files changed

+53
-0
lines changed

docgen/data/data.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2980,6 +2980,21 @@
29802980
"params": {},
29812981
"additional": {}
29822982
},
2983+
"setactiveweapon": {
2984+
"title": "SetActiveWeapon",
2985+
"template": "function-syntax",
2986+
"language": "both",
2987+
"description": "Sets the active weapon.",
2988+
"variable": {
2989+
"cpp": "player->weapons->SetActiveWeapon",
2990+
"lua": "player:weapons():SetActiveWeapon"
2991+
},
2992+
"return": "void",
2993+
"params": {
2994+
"slot": "WeaponSlot"
2995+
},
2996+
"additional": {}
2997+
},
29832998
"getweapon": {
29842999
"title": "GetWeapon",
29853000
"template": "function-syntax",

plugin_files/scripting/includes/swiftly/player/weapons.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ typedef void (*Player_DropWeapons)(uint32_t);
1515
typedef void (*Player_RemoveWeapons)(uint32_t);
1616
typedef void (*Player_GiveWeapon)(uint32_t, const char *);
1717
typedef uint32_t (*Player_GetWeaponID)(uint32_t, uint32_t);
18+
typedef void (*Player_SetActiveWeapon)(uint32_t, uint32_t);
1819

1920
class Weapons
2021
{
@@ -68,6 +69,15 @@ class Weapons
6869
{
6970
return (new Weapon(this->m_playerSlot, weaponID));
7071
}
72+
73+
void SetActiveWeapon(WeaponSlot slot)
74+
{
75+
void *player_SetActiveWeapon = FetchFunctionPtr(nullptr, "scripting_Player_Weapons_SetActiveWeapon");
76+
if (player_SetActiveWeapon)
77+
reinterpret_cast<Player_SetActiveWeapon>(player_SetActiveWeapon)(this->m_playerSlot, slot);
78+
else
79+
NOT_SUPPORTED("scripting_Player_Weapons_SetActiveWeapon");
80+
}
7181
};
7282

7383
#endif

src/components/Plugins/inc/Scripting.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ SMM_API int scripting_Player_GetLatency(uint32 playerId);
187187

188188
SMM_API void scripting_Player_ExecuteCommand(uint32 playerId, const char *cmd);
189189

190+
SMM_API void scripting_Player_Weapons_SetActiveWeapon(uint32 playerId, uint32 slot);
190191
SMM_API void scripting_Player_Weapons_Drop(uint32 playerId);
191192
SMM_API void scripting_Player_Weapons_Remove(uint32 playerId);
192193
SMM_API void scripting_Player_Weapons_Give(uint32 playerId, const char *name);

src/components/Plugins/src/language/lua/player.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,8 @@ void SetupLuaPlayer(luacpp::LuaState *state, Plugin *plugin)
280280
{ scripting_Player_Weapons_Remove(base->playerSlot); })
281281
.DefMember("GiveWeapons", [](LuaPlayerArgsClass *base, const char *name) -> void
282282
{ scripting_Player_Weapons_Give(base->playerSlot, name); })
283+
.DefMember("SetActiveWeapon", [](LuaPlayerArgsClass *base, uint32 slot) -> void
284+
{ scripting_Player_Weapons_SetActiveWeapon(base->playerSlot, slot); })
283285
.DefMember("GetWeaponFromSlot", [weaponClass](LuaPlayerArgsClass *base, uint32 slot) -> luacpp::LuaObject
284286
{ return weaponClass.CreateInstance(base->playerSlot, scripting_Player_Weapons_GetWeaponID(base->playerSlot, slot)); })
285287
.DefMember("GetWeapon", [weaponClass](LuaPlayerArgsClass *base, uint32 weaponID) -> luacpp::LuaObject

src/components/Plugins/src/scripting/Player.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,31 @@ SMM_API uint32_t scripting_Player_Weapon_GetSilencerType(uint32 playerId, uint32
756756
return vData->m_eSilencerType();
757757
}
758758

759+
SMM_API void scripting_Player_Weapons_SetActiveWeapon(uint32 playerId, uint32 slot)
760+
{
761+
Player *player = g_playerManager->GetPlayer(playerId);
762+
if (!player)
763+
return;
764+
765+
CBasePlayerWeapon *weapon = player->GetPlayerWeaponFromSlot((gear_slot_t)slot);
766+
if (!weapon)
767+
return;
768+
769+
CCSPlayerPawn *pawn = player->GetPlayerPawn();
770+
if (!pawn)
771+
return;
772+
773+
CPlayer_WeaponServices *weaponServices = pawn->m_pWeaponServices();
774+
if (!weaponServices)
775+
return;
776+
777+
CCSPlayer_ItemServices *itemServices = pawn->m_pItemServices();
778+
if (!itemServices)
779+
return;
780+
781+
weaponServices->m_hActiveWeapon = weapon;
782+
}
783+
759784
SMM_API void scripting_Player_Weapon_SetReserveAmmo(uint32 playerId, uint32 slot, int ammo)
760785
{
761786
Player *player = g_playerManager->GetPlayer(playerId);

0 commit comments

Comments
 (0)