mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-05-06 19:01:04 +03:00
Implemented TOW Entities
This commit is contained in:
parent
a50102ef52
commit
ad47f8855b
2 changed files with 289 additions and 1 deletions
|
@ -21,6 +21,246 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Tow_Entities.h"
|
#include "Tow_Entities.h"
|
||||||
|
#include "player.h"
|
||||||
|
#include "scriptthread.h"
|
||||||
|
|
||||||
// FIXME: unimplemented
|
TOWObjectiveMan g_TOWObjectiveMan;
|
||||||
|
|
||||||
|
TOWObjectiveMan::TOWObjectiveMan()
|
||||||
|
{
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjectiveMan::Reset()
|
||||||
|
{
|
||||||
|
m_towObjectives.ClearObjectList();
|
||||||
|
m_iNumAxisObjectives = 0;
|
||||||
|
m_iNumAlliesObjectives = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjectiveMan::AddObjective(TOWObjective *objective)
|
||||||
|
{
|
||||||
|
if (!objective) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (objective->GetController()) {
|
||||||
|
case CONTROLLER_ALLIES:
|
||||||
|
m_iNumAlliesObjectives++;
|
||||||
|
break;
|
||||||
|
case CONTROLLER_AXIS:
|
||||||
|
m_iNumAxisObjectives++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_towObjectives.AddObject(objective);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjectiveMan::TakeOverObjective(eController controller, eController controllingTeam)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (controllingTeam == CONTROLLER_DRAW) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (controllingTeam) {
|
||||||
|
case CONTROLLER_ALLIES:
|
||||||
|
m_iNumAlliesObjectives++;
|
||||||
|
if (m_iNumAxisObjectives) {
|
||||||
|
m_iNumAxisObjectives--;
|
||||||
|
}
|
||||||
|
dmManager.CheckEndMatch();
|
||||||
|
break;
|
||||||
|
case CONTROLLER_AXIS:
|
||||||
|
m_iNumAxisObjectives++;
|
||||||
|
if (m_iNumAlliesObjectives) {
|
||||||
|
m_iNumAlliesObjectives--;
|
||||||
|
}
|
||||||
|
dmManager.CheckEndMatch();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < game.maxclients; i++) {
|
||||||
|
gentity_t *ent = &g_entities[i];
|
||||||
|
Player *player;
|
||||||
|
bool bSameTeam;
|
||||||
|
|
||||||
|
if (!ent->inuse || !ent->entity) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
player = static_cast<Player *>(ent->entity);
|
||||||
|
|
||||||
|
switch (controllingTeam) {
|
||||||
|
case CONTROLLER_ALLIES:
|
||||||
|
bSameTeam = player->GetTeam() == TEAM_ALLIES;
|
||||||
|
break;
|
||||||
|
case CONTROLLER_AXIS:
|
||||||
|
bSameTeam = player->GetTeam() == TEAM_AXIS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// play a different sound for the losing team
|
||||||
|
if (bSameTeam) {
|
||||||
|
player->PlayInstantMessageSound("success");
|
||||||
|
} else {
|
||||||
|
player->PlayInstantMessageSound("failure");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Event EV_SetController("ControlledBy", EV_DEFAULT, "i", "ControlledBy", "Sets the team controlling the objective");
|
||||||
|
Event EV_TakeOver(
|
||||||
|
"TakeOver", EV_DEFAULT, "i", "TeamNum", "Sets the team controlling the objective. 0 = Axis, 1 = Allies"
|
||||||
|
);
|
||||||
|
Event EV_SetAxisObjNum("AxisObjNum", EV_DEFAULT, "i", "AxisObjNum", "Sets the objective number for the axis team");
|
||||||
|
Event EV_SetAlliesObjNum(
|
||||||
|
"AlliesObjNum", EV_DEFAULT, "i", "AlliesObjNum", "Sets the objective number for the allies team"
|
||||||
|
);
|
||||||
|
static Event EV_Initialize("initialize", EV_DEFAULT, 0, 0, "Initialize object");
|
||||||
|
static Event EV_SetCurrent(
|
||||||
|
"SetCurrent", EV_DEFAULT, "i", "TeamNum", "Set this objective as the current objective for the specified team."
|
||||||
|
);
|
||||||
|
Event EV_GetController("ControlledBy", EV_DEFAULT, 0, 0, "Objective controller", EV_GETTER);
|
||||||
|
|
||||||
|
CLASS_DECLARATION(Objective, TOWObjective, "func_towobjective") {
|
||||||
|
{&EV_SetController, &TOWObjective::SetController },
|
||||||
|
{&EV_TakeOver, &TOWObjective::TakeOver },
|
||||||
|
{&EV_SetAxisObjNum, &TOWObjective::SetAxisObjNum },
|
||||||
|
{&EV_SetAlliesObjNum, &TOWObjective::SetAlliesObjNum},
|
||||||
|
{&EV_Initialize, &TOWObjective::OnInitialize },
|
||||||
|
{&EV_SetCurrent, &TOWObjective::SetCurrent },
|
||||||
|
{&EV_GetController, &TOWObjective::GetController },
|
||||||
|
{NULL, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
TOWObjective::TOWObjective()
|
||||||
|
{
|
||||||
|
m_eController = CONTROLLER_DRAW;
|
||||||
|
m_eLeadingController = CONTROLLER_DRAW;
|
||||||
|
m_bNoRespawnForLeading = false;
|
||||||
|
m_iAxisObjNum = 1;
|
||||||
|
m_iAlliesObjNum = 1;
|
||||||
|
m_sAxisObjName = "default";
|
||||||
|
m_sAlliesObjName = "default";
|
||||||
|
|
||||||
|
if (spawnflags & TOWOBJECTIVE_SPAWNFLAG_NO_RESPAWN) {
|
||||||
|
m_bNoRespawnForLeading = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
PostEvent(EV_Initialize, 0.001f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjective::SetController(Event *ev)
|
||||||
|
{
|
||||||
|
m_eController = static_cast<eController>(ev->GetInteger(1));
|
||||||
|
|
||||||
|
if (m_bNoRespawnForLeading) {
|
||||||
|
m_eLeadingController = m_eController;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_eController != CONTROLLER_ALLIES && m_eController != CONTROLLER_AXIS) {
|
||||||
|
m_eController = CONTROLLER_DRAW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjective::GetController(Event *ev)
|
||||||
|
{
|
||||||
|
ev->AddInteger(m_eController);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjective::TakeOver(Event *ev)
|
||||||
|
{
|
||||||
|
eController controller = static_cast<eController>(ev->GetInteger(1));
|
||||||
|
if (controller == m_eController || controller == CONTROLLER_DRAW) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (controller) {
|
||||||
|
case CONTROLLER_ALLIES:
|
||||||
|
gi.Cvar_Set(m_sAxisObjName.c_str(), "1");
|
||||||
|
gi.Cvar_Set(m_sAlliesObjName.c_str(), "0");
|
||||||
|
break;
|
||||||
|
case CONTROLLER_AXIS:
|
||||||
|
gi.Cvar_Set(m_sAxisObjName.c_str(), "0");
|
||||||
|
gi.Cvar_Set(m_sAlliesObjName.c_str(), "1");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_TOWObjectiveMan.TakeOverObjective(m_eController, controller);
|
||||||
|
|
||||||
|
if (m_bNoRespawnForLeading) {
|
||||||
|
//
|
||||||
|
// Disable team respawn for the leading team
|
||||||
|
//
|
||||||
|
dmManager.StopTeamRespawn(m_eLeadingController);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjective::SetAlliesObjNum(Event *ev)
|
||||||
|
{
|
||||||
|
m_iAlliesObjNum = ev->GetInteger(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjective::SetAxisObjNum(Event *ev)
|
||||||
|
{
|
||||||
|
m_iAxisObjNum = ev->GetInteger(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjective::OnInitialize(Event *ev)
|
||||||
|
{
|
||||||
|
m_sAlliesObjName = "tow_allied_obj" + m_iAlliesObjNum;
|
||||||
|
m_sAxisObjName = "tow_allied_obj" + m_iAxisObjNum;
|
||||||
|
|
||||||
|
switch (m_eController) {
|
||||||
|
case CONTROLLER_ALLIES:
|
||||||
|
gi.Cvar_Set(m_sAxisObjName.c_str(), "1");
|
||||||
|
gi.Cvar_Set(m_sAlliesObjName.c_str(), "0");
|
||||||
|
break;
|
||||||
|
case CONTROLLER_AXIS:
|
||||||
|
gi.Cvar_Set(m_sAxisObjName.c_str(), "0");
|
||||||
|
gi.Cvar_Set(m_sAlliesObjName.c_str(), "1");
|
||||||
|
break;
|
||||||
|
case CONTROLLER_DRAW:
|
||||||
|
gi.Cvar_Set(m_sAxisObjName.c_str(), "0");
|
||||||
|
gi.Cvar_Set(m_sAlliesObjName.c_str(), "0");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!LoadingSavegame) {
|
||||||
|
g_TOWObjectiveMan.AddObjective(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjective::SetCurrent(Event *ev)
|
||||||
|
{
|
||||||
|
eController controller = static_cast<eController>(ev->GetInteger(1));
|
||||||
|
switch (controller) {
|
||||||
|
case CONTROLLER_ALLIES:
|
||||||
|
ScriptThread::SetCurrentObjective(GetObjectiveIndex(), TEAM_ALLIES);
|
||||||
|
break;
|
||||||
|
case CONTROLLER_AXIS:
|
||||||
|
ScriptThread::SetCurrentObjective(GetObjectiveIndex(), TEAM_AXIS);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SetCurrent(ev);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int TOWObjective::GetController() const
|
||||||
|
{
|
||||||
|
return m_eController;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOWObjective::Archive(Archiver& arc)
|
||||||
|
{
|
||||||
|
arc.ArchiveInteger(&m_iAxisObjNum);
|
||||||
|
arc.ArchiveInteger(&m_iAlliesObjNum);
|
||||||
|
ArchiveEnum(m_eController, eController);
|
||||||
|
ArchiveEnum(m_eLeadingController, eController);
|
||||||
|
arc.ArchiveBool(&m_bNoRespawnForLeading);
|
||||||
|
arc.ArchiveString(&m_sAxisObjName);
|
||||||
|
arc.ArchiveString(&m_sAlliesObjName);
|
||||||
|
}
|
||||||
|
|
|
@ -21,3 +21,51 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Entities.h"
|
||||||
|
|
||||||
|
#define TOWOBJECTIVE_SPAWNFLAG_NO_RESPAWN 2
|
||||||
|
|
||||||
|
class TOWObjective : public Objective
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
int m_iAxisObjNum;
|
||||||
|
int m_iAlliesObjNum;
|
||||||
|
eController m_eController;
|
||||||
|
eController m_eLeadingController;
|
||||||
|
bool m_bNoRespawnForLeading;
|
||||||
|
str m_sAxisObjName;
|
||||||
|
str m_sAlliesObjName;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CLASS_PROTOTYPE(TOWObjective);
|
||||||
|
|
||||||
|
TOWObjective();
|
||||||
|
|
||||||
|
void SetController(Event *ev);
|
||||||
|
void GetController(Event *ev);
|
||||||
|
void TakeOver(Event *ev);
|
||||||
|
void SetAlliesObjNum(Event *ev);
|
||||||
|
void SetAxisObjNum(Event *ev);
|
||||||
|
void OnInitialize(Event *ev);
|
||||||
|
void SetCurrent(Event *ev);
|
||||||
|
|
||||||
|
int GetController() const;
|
||||||
|
|
||||||
|
void Archive(Archiver& arc);
|
||||||
|
};
|
||||||
|
|
||||||
|
class TOWObjectiveMan
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Container<TOWObjective *> m_towObjectives;
|
||||||
|
int m_iNumAxisObjectives;
|
||||||
|
int m_iNumAlliesObjectives;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TOWObjectiveMan();
|
||||||
|
|
||||||
|
void Reset();
|
||||||
|
void AddObjective(TOWObjective *objective);
|
||||||
|
void TakeOverObjective(eController controller, eController controllingTeam);
|
||||||
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue