From 2fc28052c35f5ea5f02c9e6d3333b0bdbd538a6a Mon Sep 17 00:00:00 2001 From: JerryALT Date: Tue, 18 Jun 2024 15:09:31 +0300 Subject: [PATCH] [Weapons]: Added new functions and some fixes --- src/Components/Modules/Weapons.cpp | 79 ++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 9 deletions(-) diff --git a/src/Components/Modules/Weapons.cpp b/src/Components/Modules/Weapons.cpp index f12f880..96310d5 100644 --- a/src/Components/Modules/Weapons.cpp +++ b/src/Components/Modules/Weapons.cpp @@ -57,11 +57,11 @@ namespace Components Dvars::p_allowFire = Dvars::Register::Dvar_RegisterBool("p_allowFire", "Enables/Disables player fire", true, Game::saved_flag); }); - GSC::AddFunction("getweapondamage", [] + GSC::AddFunction("GetWeaponDamage", [] { if (Game::Scr_GetNumParam() != 1) { - Game::Scr_Error("getweapondamage( weaponName ) requires one parameter"); + Game::Scr_Error("GetWeaponDamage( weaponName ) requires one parameter"); return; } @@ -70,11 +70,11 @@ namespace Components return Game::Scr_AddInt(weapon->damage); }, false); - GSC::AddFunction("setweapondamage", [] + GSC::AddFunction("SetWeaponDamage", [] { if (Game::Scr_GetNumParam() != 2) { - Game::Scr_Error("setweapondamage( weaponName, value ) requires two parameters"); + Game::Scr_Error("SetWeaponDamage( weaponName, value ) requires two parameters"); return; } @@ -96,16 +96,77 @@ namespace Components } int fxId = Game::Scr_GetInt(0); - int realTagName = Game::Scr_GetConstString(1); - unsigned int weaponIndex = Game::ps->weapon; + int tagName = Game::Scr_GetConstString(1); - const auto weaponDef = Game::bg_weaponDefs[weaponIndex]; + unsigned int weaponIndex = Game::ps->weapon; + const auto viewmodelInfo = &Game::cg_weaponsArray[weaponIndex]; + + std::uint8_t bone = 254; + if (!Game::DObjGetBoneIndex(viewmodelInfo->viewModelDObj, tagName, &bone)) + { + const char* error_msg = Utils::String::VA("PlayViewmodelFX(): viewmodel weapon '%s', does not have bone '%s'", viewmodelInfo->translatedDisplayName, Game::SL_ConvertToString(tagName)); + Game::Scr_Error(error_msg); + return; + } Game::CG_PlayBoltedEffect(Game::cgs->localClientNum, - Game::scr_const->tag_flash, - weaponIndex + 2176, + tagName, + weaponIndex + 2176, // <-- CG_WeaponDObjHandle Game::cgsArray->fxs[fxId]); Game::Scr_AddInt(true); + + }, false); + + GSC::AddFunction("ViewmodelHideTag", [] + { + if (Game::Scr_GetNumParam() != 1) + { + Game::Scr_Error("ViewmodelHideTag() called with wrong params.\n"); + return; + } + + int tagName = Game::Scr_GetConstString(0); + + unsigned int weaponIndex = Game::ps->weapon; + const auto viewmodelInfo = &Game::cg_weaponsArray[weaponIndex]; + + std::uint8_t bone = 254; + if (!Game::DObjGetBoneIndex(viewmodelInfo->viewModelDObj, tagName, &bone)) + { + const char* error_msg = Utils::String::VA("ViewmodelHideTag: No such bone tag (%s) for weapon (%s)", viewmodelInfo->translatedDisplayName, Game::SL_ConvertToString(tagName)); + Game::Scr_Error(error_msg); + return; + } + + viewmodelInfo->partBits[bone >> 5] |= 0x80000000 >> (bone & 0x1F); + Game::ChangeViewmodelDobj(Game::g_clients->ps.weapon, Game::g_clients->ps.weaponmodels[Game::g_clients->ps.weapon], viewmodelInfo->handModel, viewmodelInfo->gogglesModel, viewmodelInfo->rocketModel, viewmodelInfo->knifeModel, 1); + Game::Scr_AddInt(true); + }, false); + + GSC::AddFunction("ViewmodelShowTag", [] + { + if (Game::Scr_GetNumParam() != 1) + { + Game::Scr_Error("ViewmodelShowTag() called with wrong params.\n"); + return; + } + + int tagName = Game::Scr_GetConstString(0); + + unsigned int weaponIndex = Game::ps->weapon; + const auto viewmodelInfo = &Game::cg_weaponsArray[weaponIndex]; + + std::uint8_t bone = 254; + if (!Game::DObjGetBoneIndex(viewmodelInfo->viewModelDObj, tagName, &bone)) + { + const char* error_msg = Utils::String::VA("ViewmodelShowTag: No such bone tag (%s) for weapon (%s)", viewmodelInfo->translatedDisplayName, Game::SL_ConvertToString(tagName)); + Game::Scr_Error(error_msg); + return; + } + + viewmodelInfo->partBits[bone >> 5] &= ~(0x80000000 >> (bone & 0x1F)); + Game::ChangeViewmodelDobj(Game::g_clients->ps.weapon, Game::g_clients->ps.weaponmodels[Game::g_clients->ps.weapon], viewmodelInfo->handModel, viewmodelInfo->gogglesModel, viewmodelInfo->rocketModel, viewmodelInfo->knifeModel, 1); + Game::Scr_AddInt(true); }, false); Utils::Hook(0x5C2C91, Weapons::FireWeaponStub, HOOK_JUMP).install()->quick();