mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-05-06 19:01:04 +03:00
Added and implemented TriggerNoDamage, TriggerEntity and TriggerLandmine
This commit is contained in:
parent
ca61fde54b
commit
367d6ff6fc
2 changed files with 194 additions and 0 deletions
|
@ -3211,3 +3211,158 @@ void TriggerClickItem::SetClickItemModelEvent
|
|||
edict->r.svFlags |= SVF_NOCLIENT;
|
||||
link();
|
||||
}
|
||||
|
||||
CLASS_DECLARATION(TriggerUse, TriggerNoDamage, "trigger_nodamage")
|
||||
{
|
||||
{ &EV_Touch, &TriggerNoDamage::TakeNoDamage },
|
||||
{ &EV_Trigger_Effect, &TriggerNoDamage::TakeNoDamage },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
void TriggerNoDamage::TakeNoDamage(Event* ev)
|
||||
{
|
||||
Entity* ent = ev->GetEntity(1);
|
||||
Event* newev;
|
||||
|
||||
ent->ProcessEvent(EV_NoDamage);
|
||||
ent->CancelEventsOfType(EV_TakeDamage);
|
||||
|
||||
// Make sure the entity will take damage
|
||||
// outside the trigger
|
||||
newev = new Event(EV_TakeDamage);
|
||||
ent->PostEvent(newev, level.frametime * 3);
|
||||
}
|
||||
|
||||
CLASS_DECLARATION(Trigger, TriggerEntity, "trigger_entity")
|
||||
{
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
Event EV_Trigger_IsAbandonned
|
||||
(
|
||||
"isabandonned",
|
||||
EV_DEFAULT,
|
||||
"e",
|
||||
"owner",
|
||||
"Returns true if the owner has abandoned the mine",
|
||||
EV_RETURN
|
||||
);
|
||||
|
||||
Event EV_Trigger_IsImmune
|
||||
(
|
||||
"isimmune",
|
||||
EV_DEFAULT,
|
||||
"e",
|
||||
"owner",
|
||||
"Returns true if the given entity is immune to this landmine",
|
||||
EV_RETURN
|
||||
);
|
||||
|
||||
Event EV_Trigger_SetDamageable
|
||||
(
|
||||
"damageable",
|
||||
EV_DEFAULT,
|
||||
"b",
|
||||
"isDamageable",
|
||||
"Makes the trigger able to take damage, but it is up to the script to watch this damage",
|
||||
EV_RETURN
|
||||
);
|
||||
|
||||
CLASS_DECLARATION(TriggerEntity, TriggerLandmine, "trigger_landmine")
|
||||
{
|
||||
{ &EV_Trigger_IsAbandonned, &TriggerLandmine::EventIsAbandoned },
|
||||
{ &EV_Trigger_IsImmune, &TriggerLandmine::EventIsImmune },
|
||||
{ &EV_Trigger_SetDamageable, &TriggerLandmine::EventSetDamageable },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
TriggerLandmine::TriggerLandmine()
|
||||
{
|
||||
setMoveType(MOVETYPE_TOSS);
|
||||
setSolidType(SOLID_TRIGGER);
|
||||
setContentsSolid();
|
||||
edict->clipmask = MASK_LANDMINE;
|
||||
setSize(mins, maxs);
|
||||
|
||||
team = -1;
|
||||
max_health = health;
|
||||
deadflag = DEAD_NO;
|
||||
takedamage = DAMAGE_YES;
|
||||
}
|
||||
|
||||
void TriggerLandmine::EventIsAbandoned(Event* ev)
|
||||
{
|
||||
Entity* other = ev->GetEntity(1);
|
||||
Player* p;
|
||||
str weapontype;
|
||||
|
||||
if (!other) {
|
||||
ev->AddInteger(1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!other->IsSubclassOfPlayer()) {
|
||||
ev->AddInteger(0);
|
||||
return;
|
||||
}
|
||||
|
||||
p = static_cast<Player*>(other);
|
||||
|
||||
if (team && team != p->GetTeam()) {
|
||||
ev->AddInteger(1);
|
||||
}
|
||||
|
||||
weapontype = p->GetCurrentDMWeaponType();
|
||||
|
||||
if (!str::icmp(weapontype, "landmine")) {
|
||||
ev->AddInteger(1);
|
||||
} else {
|
||||
ev->AddInteger(0);
|
||||
}
|
||||
}
|
||||
|
||||
void TriggerLandmine::EventIsImmune(Event* ev)
|
||||
{
|
||||
Entity* ent = ev->GetEntity(1);
|
||||
ev->AddInteger(IsImmune(ent));
|
||||
}
|
||||
|
||||
void TriggerLandmine::EventSetDamageable(Event* ev)
|
||||
{
|
||||
SetDamageable(ev->GetBoolean(1));
|
||||
}
|
||||
|
||||
void TriggerLandmine::SetDamageable(qboolean damageable)
|
||||
{
|
||||
if (damageable) {
|
||||
setContentsSolid();
|
||||
} else {
|
||||
setContents(0);
|
||||
}
|
||||
}
|
||||
|
||||
qboolean TriggerLandmine::IsImmune(Entity* other) const
|
||||
{
|
||||
if (!other) {
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
if (entnum == other->entnum) {
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
if (edict->r.ownerNum == other->entnum) {
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
if (!other->inheritsFrom(&Player::ClassInfo)) {
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
return static_cast<Player*>(other)->GetTeam() == team;
|
||||
}
|
||||
|
||||
void TriggerLandmine::SetTeam(int team)
|
||||
{
|
||||
this->team = team;
|
||||
}
|
||||
|
|
|
@ -701,4 +701,43 @@ inline void TriggerClickItem::Archive
|
|||
Trigger::Archive( arc );
|
||||
}
|
||||
|
||||
class TriggerNoDamage : public TriggerUse {
|
||||
public:
|
||||
CLASS_PROTOTYPE(TriggerNoDamage);
|
||||
|
||||
public:
|
||||
void TakeNoDamage(Event* ev);
|
||||
};
|
||||
|
||||
class TriggerEntity : public Trigger {
|
||||
public:
|
||||
CLASS_PROTOTYPE(TriggerEntity);
|
||||
};
|
||||
|
||||
class TriggerLandmine : public TriggerEntity {
|
||||
public:
|
||||
CLASS_PROTOTYPE(TriggerLandmine);
|
||||
|
||||
TriggerLandmine();
|
||||
void Archive(Archiver& arc) override;
|
||||
|
||||
void EventIsAbandoned(Event* ev);
|
||||
void EventIsImmune(Event* ev);
|
||||
void EventSetDamageable(Event* ev);
|
||||
|
||||
void SetDamageable(qboolean damageable);
|
||||
qboolean IsImmune(Entity* other) const;
|
||||
void SetTeam(int team);
|
||||
|
||||
private:
|
||||
int team;
|
||||
};
|
||||
|
||||
inline void TriggerLandmine::Archive(Archiver& arc)
|
||||
{
|
||||
Trigger::Archive(arc);
|
||||
|
||||
arc.ArchiveInteger(&team);
|
||||
}
|
||||
|
||||
#endif /* trigger.h */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue