//------------------------------------------------------------------------ void CGameRules::ServerSimpleHit(const SimpleHitInfo &simpleHitInfo) { if (my->CallHook( "OnEntityDamage", oohh::GetEntityFromId(simpleHitInfo.targetId), oohh::GetEntityFromId(simpleHitInfo.weaponId), oohh::GetEntityFromId(simpleHitInfo.shooterId), simpleHitInfo.value, Vec3(0,0,0), Vec3(0,0,0) )) { if (true) return; } switch (simpleHitInfo.type) { case 0: // tag { if (!simpleHitInfo.targetId) return; // tagged entities are temporary in MP, not in SP. bool temp = gEnv->bMultiplayer; AddTaggedEntity(simpleHitInfo.shooterId, simpleHitInfo.targetId, temp); } break; case 1: // tac { if (!simpleHitInfo.targetId) return; CActor *pActor = (CActor *)gEnv->pGame->GetIGameFramework()->GetIActorSystem()->GetActor(simpleHitInfo.targetId); if (pActor && pActor->CanSleep()) pActor->Fall(Vec3(0.0f,0.0f,0.0f),simpleHitInfo.value); } break; case 0xe: // freeze { if (!simpleHitInfo.targetId) return; // call OnFreeze bool allow=true; if (m_serverStateScript.GetPtr() && m_serverStateScript->GetValueType("OnFreeze")==svtFunction) { HSCRIPTFUNCTION func=0; m_serverStateScript->GetValue("OnFreeze", func); Script::CallReturn(m_serverStateScript->GetScriptSystem(), func, m_script, ScriptHandle(simpleHitInfo.targetId), ScriptHandle(simpleHitInfo.shooterId), ScriptHandle(simpleHitInfo.weaponId), simpleHitInfo.value, allow); gEnv->pScriptSystem->ReleaseFunc(func); } if (!allow) return; if (IEntity *pEntity=gEnv->pEntitySystem->GetEntity(simpleHitInfo.targetId)) { IScriptTable *pScriptTable=pEntity->GetScriptTable(); // call OnFrost if (pScriptTable && pScriptTable->GetValueType("OnFrost")==svtFunction) { HSCRIPTFUNCTION func=0; pScriptTable->GetValue("OnFrost", func); Script::Call(pScriptTable->GetScriptSystem(), func, pScriptTable, ScriptHandle(simpleHitInfo.shooterId), ScriptHandle(simpleHitInfo.weaponId), simpleHitInfo.value); gEnv->pScriptSystem->ReleaseFunc(func); } FreezeEntity(simpleHitInfo.targetId, true, true, simpleHitInfo.value>0.999f); } } break; default: assert(!"Unknown Simple Hit type!"); } }
//------------------------------------------------------------------------ void CGameRules::ServerSimpleHit(const SimpleHitInfo &simpleHitInfo) { switch (simpleHitInfo.type) { case 0: // tag { if (!simpleHitInfo.targetId) return; // tagged entities are temporary in MP, not in SP. // bool temp = gEnv->bMultiplayer; //kirill: - not anymore - design says must stay on bool temp = false; AddTaggedEntity(simpleHitInfo.shooterId, simpleHitInfo.targetId, temp); } break; case 1: // tac { if (!simpleHitInfo.targetId) return; CActor *pActor = (CActor *)gEnv->pGame->GetIGameFramework()->GetIActorSystem()->GetActor(simpleHitInfo.targetId); if (pActor && pActor->CanSleep()) { pActor->Fall(Vec3(0.0f,0.0f,0.0f),false,simpleHitInfo.value); //This is only used in SP by the player, so don't need further checks CPlayer* pPlayer = static_cast<CPlayer*>(g_pGame->GetIGameFramework()->GetClientActor()); if(pPlayer) pPlayer->PlaySound(CPlayer::ESound_TacBulletFeedBack,true); } } break; case 0xe: // freeze { if (!simpleHitInfo.targetId) return; CActor *pActor=GetActorByEntityId(simpleHitInfo.targetId); if (pActor && pActor->IsPlayer() && pActor->GetActorClass()==CPlayer::GetActorClassType()) { CPlayer *pPlayer=static_cast<CPlayer *>(pActor); if (CNanoSuit *pSuit=pPlayer->GetNanoSuit()) if (pSuit->IsInvulnerable()) return; } // call OnFreeze bool allow=true; if (m_serverStateScript.GetPtr() && m_serverStateScript->GetValueType("OnFreeze")==svtFunction) { HSCRIPTFUNCTION func=0; m_serverStateScript->GetValue("OnFreeze", func); Script::CallReturn(m_serverStateScript->GetScriptSystem(), func, m_script, ScriptHandle(simpleHitInfo.targetId), ScriptHandle(simpleHitInfo.shooterId), ScriptHandle(simpleHitInfo.weaponId), simpleHitInfo.value, allow); gEnv->pScriptSystem->ReleaseFunc(func); } if (!allow) return; if (IEntity *pEntity=gEnv->pEntitySystem->GetEntity(simpleHitInfo.targetId)) { IScriptTable *pScriptTable=pEntity->GetScriptTable(); // call OnFrost if (pScriptTable && pScriptTable->GetValueType("OnFrost")==svtFunction) { HSCRIPTFUNCTION func=0; pScriptTable->GetValue("OnFrost", func); Script::Call(pScriptTable->GetScriptSystem(), func, pScriptTable, ScriptHandle(simpleHitInfo.shooterId), ScriptHandle(simpleHitInfo.weaponId), simpleHitInfo.value); gEnv->pScriptSystem->ReleaseFunc(func); } FreezeEntity(simpleHitInfo.targetId, true, true, simpleHitInfo.value>0.999f); } } break; default: assert(!"Unknown Simple Hit type!"); } }