кто знает о такой чит команде как give_tank, кто баловался?
будучи выжившим, прописав данную команду, получаешь возможность бросать камни как танк, вот я и задумался как будет выглядеть использование всех остальных Ability имеющихся в игре.
Вот код, который позволяет использовать все 4 Ability:
CBaseEntity *Create(const char *szName, Vector *vecOrigin, QAngle *vecAngel, CBaseEntity *pOwner)
{
CBaseEntity* pEnt = (CBaseEntity *)servertools->CreateEntityByName(szName);
if(!pEnt)
{
Msg("Create: only works for CBaseEntity\n");
return nullptr;
}
PropData_set_vecOrigin(pEnt, vecOrigin); //Prop_Data m_vecOrigin
PropData_set_angRotation(pEnt, vecAngel); //Prop_Data m_angRotation
Prop_set_hOwnerEntity(pEnt, pOwner); //Prop_Data m_hOwnerEntity
servertools->DispatchSpawn(pEnt);
return pEnt;
}
void OnCreate(CBaseEntity* pThisPtr, CBaseEntity *pEnt)
{
void **this_ptr = *reinterpret_cast<void ***>(&pThisPtr);
void **vtable = *reinterpret_cast<void ***>(pThisPtr);
void *func = vtable[191];
union
{
void (VfuncEmptyClass::*mfpnew)(CBaseEntity *) const;
struct
{
void *addr;
intptr_t adjustor;
} s;
} u;
u.s.addr = func;
u.s.adjustor = 0;
(void) (reinterpret_cast<VfuncEmptyClass*>(this_ptr)->*u.mfpnew)(pEnt);
}
bool AddAbility(CBaseEntity *pThis, const char *szNameAbility, const char *szWeapon)
{
pVFBase->RemoveAllItems(pThis, true); //CCSPlayer::RemoveAllItems virtual function offset 346
pVFBase->GiveNamedItem(pThis, szWeapon, 0, true); //CTerrorPlayer::GiveNamedItem virtual function offset 405
CBaseEntity *pEntity = Prop_get_customAbility((CBaseEntity*)pThis); //Prop_Send m_customAbility
if(pEntity)
{
g_HL2->UTILRemove(pEntity); //_Z11UTIL_RemoveP11CBaseEntity
}
QAngle *pAngel = g_HL2->GetAbsAngles((CBaseEntity *)pThis); //_ZNK11CBaseEntity12GetAbsAnglesEv
Vector pEaePos = pVFBase->EyePosition(pThis); //CBaseEntity::EyePosition virtual function offset 127
CBaseEntity *pAbility = Create(szNameAbility, &pEaePos, pAngel, (CBaseEntity *)pThis);
if(pAbility)
{
*((CBaseHandle *)pThis + 1934) = pVFBase->GetRefEHandle(pAbility); //CBaseEntity::GetRefEHandle virtual function offset 3
}
else
{
*((DWORD *)pThis + 1934) = -1;
}
CBaseEntity *pEnt = Prop_get_customAbility((CBaseEntity*)pThis); //Prop_Send m_customAbility
if(pEnt)
{
OnCreate(pEnt, pThis);
}
return true;
}
bool GiveDefaultAbility(CTerrorPlayer *pThis)
{
pVFBase->RemoveAllItems(pThis, true); //CCSPlayer::RemoveAllItems virtual function offset 346
pVFBase->GiveNamedItem(pThis, "weapon_pistol", 0, true); //CTerrorPlayer::GiveNamedItem virtual functio offset 405
CBaseEntity *pEntity = Prop_get_customAbility((CBaseEntity*)pThis); //Prop_Send m_customAbility
if(pEntity)
{
g_HL2->UTILRemove(pEntity); //_Z11UTIL_RemoveP11CBaseEntity
}
return true;
}
А так сделав native можно добавить в плагин:
public Action:CmdGiveTank(client, args)
{
if(client > 0)
{
if(IsClientConnected(client) && IsClientInGame(client))
{
if(IsClientAlive(client))
{
char ar[32];
GetCmdArg(1, ar, sizeof(ar));
if(StrEqual(ar, "tank")) {
GiveAbility(client, "ability_throw", "weapon_tank_claw");
} else if(StrEqual(ar, "boomer")) {
GiveAbility(client, "ability_vomit", "weapon_boomer_claw");
} else if(StrEqual(ar, "smoker")) {
GiveAbility(client, "ability_tongue", "weapon_smoker_claw");
} else if(StrEqual(ar, "hunter")) {
GiveAbility(client, "ability_lunge", "weapon_hunter_claw");
}
}
}
}
return Plugin_Handled;
}
Сама без понтова это бумера тупо рвешь и все, курильщика можно к себе подтянуть любого выжившего, охотника можно также прыгать а танка бросать камни, но если у перса есть какие-то предметы там таблетки или оружие она пропадает если он берет какую-нибудь абилку, перед этим нужно все сбросить.
Сообщение отредактировал DenMarko: 18 Апрель 2024 - 15:33