OpenMoHAA 0.82.0
Loading...
Searching...
No Matches
entity.h
1/*
2===========================================================================
3Copyright (C) 2023 the OpenMoHAA team
4
5This file is part of OpenMoHAA source code.
6
7OpenMoHAA source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12OpenMoHAA source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with OpenMoHAA source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22
23// entity.h: Base class for all enities that are controlled by Sin. If you have any
24// object that should be called on a periodic basis and it is not an entity,
25// then you have to have an dummy entity that calls it.
26//
27// An entity in Sin is any object that is not part of the world-> Any non-world
28// object that is visible in Sin is an entity, although it is not required that
29// all entities be visible to the player. Some objects are basically just virtual
30// constructs that act as an instigator of certain actions, for example, some
31// triggers are invisible and cannot be touched, but when activated by other
32// objects can cause things to happen.
33//
34// All entities are capable of receiving messages from Sin or from other entities.
35// Messages received by an entity may be ignored, passed on to their superclass,
36// or acted upon by the entity itself. The programmer must decide on the proper
37// action for the entity to take to any message. There will be many messages
38// that are completely irrelevant to an entity and should be ignored. Some messages
39// may require certain states to exist and if they are received by an entity when
40// it these states don't exist may indicate a logic error on the part of the
41// programmer or map designer and should be reported as warnings (if the problem is
42// not severe enough for the game to be halted) or as errors (if the problem should
43// not be ignored at any cost).
44//
45
46#pragma once
47
48#include "g_local.h"
49#include "class.h"
50#include "vector.h"
51#include "script.h"
52#include "listener.h"
53#include "simpleentity.h"
54#include "../qcommon/delegate.h"
55
56// modification flags
57#define FLAG_IGNORE 0
58#define FLAG_CLEAR 1
59#define FLAG_ADD 2
60
61typedef enum {
62 DAMAGE_NO,
63 DAMAGE_YES, // will take damage if hit
64 DAMAGE_AIM // auto targeting recognizes this
65} damage_t;
66
67typedef enum {
68 legs,
69 torso,
70} bodypart_t;
71
72enum eAIEvent {
73 AI_EVENT_NONE,
74 AI_EVENT_WEAPON_FIRE,
75 AI_EVENT_WEAPON_IMPACT,
76 AI_EVENT_EXPLOSION,
77 AI_EVENT_AMERICAN_VOICE,
78 AI_EVENT_GERMAN_VOICE,
79 AI_EVENT_AMERICAN_URGENT,
80 AI_EVENT_GERMAN_URGENT,
81 AI_EVENT_MISC,
82 AI_EVENT_MISC_LOUD,
83 AI_EVENT_FOOTSTEP,
84 AI_EVENT_GRENADE,
85 AI_EVENT_BADPLACE, // Added in 2.0
86 AI_EVENT_MAX
87};
88
89//deadflag
90#define DEAD_NO 0
91#define DEAD_DYING 1
92#define DEAD_DEAD 2
93#define DEAD_RESPAWNABLE 3
94
95// Generic entity events
96extern Event EV_SoundDone;
97extern Event EV_Classname;
98extern Event EV_Activate;
99extern Event EV_ForceActivate;
100extern Event EV_Use;
101extern Event EV_FadeNoRemove;
102extern Event EV_FadeOut;
103extern Event EV_FadeIn;
104extern Event EV_Fade;
105extern Event EV_Killed;
106extern Event EV_GotKill;
107extern Event EV_Pain;
108extern Event EV_Damage;
109extern Event EV_Stun;
110extern Event EV_Gib;
111extern Event EV_Kill;
112extern Event EV_DeathSinkStart;
113extern Event EV_Entity_AddImmunity;
114extern Event EV_Entity_RemoveImmunity;
115
116// Physics events
117extern Event EV_MoveDone;
118extern Event EV_Touch;
119extern Event EV_Blocked;
120extern Event EV_Attach;
121extern Event EV_AttachModel;
122extern Event EV_RemoveAttachedModel;
123extern Event EV_Detach;
124extern Event EV_DetachAllChildren;
125extern Event EV_UseBoundingBox;
126extern Event EV_IsTouching;
127
128// Animation events
129extern Event EV_NewAnim;
130extern Event EV_LastFrame;
131extern Event EV_TakeDamage;
132extern Event EV_NoDamage;
133
134// script stuff
135extern Event EV_Model;
136extern Event EV_GetModel;
137extern Event EV_Hide;
138extern Event EV_Show;
139extern Event EV_BecomeSolid;
140extern Event EV_BecomeNonSolid;
141extern Event EV_Sound;
142extern Event EV_StopSound;
143extern Event EV_Bind;
144extern Event EV_Unbind;
145extern Event EV_Glue;
146extern Event EV_Unglue;
147extern Event EV_JoinTeam;
148extern Event EV_QuitTeam;
149extern Event EV_SetHealth;
150extern Event EV_SetHealth2;
151extern Event EV_Entity_GetHealth;
152extern Event EV_SetSize;
153extern Event EV_SetAlpha;
154extern Event EV_SetTargetName;
155extern Event EV_SetTarget;
156extern Event EV_SetKillTarget;
157extern Event EV_StartAnimating;
158extern Event EV_SurfaceModelEvent;
159extern Event EV_Stop;
160extern Event EV_StopLoopSound;
161extern Event EV_SetControllerAngles;
162extern Event EV_CanSee;
163
164// dir is 1
165// power is 2
166// minsize is 3
167// maxsize is 4
168// percentage is 5
169// thickness 6
170// entity is 7
171// origin 8
172
173// AI sound events
174extern Event EV_BroadcastAIEvent;
175extern Event EV_Hurt;
176extern Event EV_Heal;
177
178// Define ScriptMaster
179class ScriptMaster;
180
181//
182// Spawn args
183//
184// "spawnflags"
185// "alpha" default 1.0
186// "model"
187// "origin"
188// "targetname"
189// "target"
190//
191
192// was 8, increased to 16
193#define MAX_MODEL_CHILDREN 16
194#define MAX_GLUE_CHILDREN 8
195
196#define GL_USEANGLES 1
197
198class Entity;
199
200typedef SafePtr<Entity> EntityPtr;
201
202class Entity : public SimpleEntity
203{
204public:
205 CLASS_PROTOTYPE(Entity);
206
207 // spawning variables
208 int entnum;
209 int radnum;
210 gentity_t *edict;
211 gclient_t *client;
212 int spawnflags;
213
214 // standard variables
215 str model;
216
217 // physics variables
218 Vector mins;
219 Vector maxs;
220 Vector absmin;
221 Vector absmax;
222 Vector velocity;
223 Vector accel;
224 Vector avelocity;
225 Vector aaccel;
226 Vector size;
227 int movetype;
228 int mass;
229 float gravity;
230 float orientation[3][3];
231 gentity_t *groundentity;
232 cplane_t groundplane;
233 int groundcontents;
234
235 // Model Binding variables
236 int numchildren;
237 int children[MAX_MODEL_CHILDREN];
238
239 // Light variables
240 float lightRadius;
241
242 // Team variables
243 str moveteam;
244 class Entity *teamchain;
245 class Entity *teammaster;
246
247 // Binding variables
248 class Entity *bindmaster;
249 qboolean bind_use_my_angles;
250 Vector localorigin;
251 Vector localangles;
252
253 // targeting variables
254 str killtarget;
255
256 // Character state
257 float health;
258 float max_health;
259 int deadflag;
260 int flags;
261
262 // underwater variables
263 int watertype;
264 int waterlevel;
265
266 // Pain and damage variables
267 damage_t takedamage;
268 EntityPtr enemy;
269 float pain_finished;
270 float damage_debounce_time;
271 int damage_type;
272
273 // Glue variables
274 int m_iNumGlues;
275 EntityPtr m_pGlues[MAX_GLUE_CHILDREN];
276 int m_pGluesFlags[MAX_GLUE_CHILDREN];
277 class Entity *m_pGlueMaster;
278 bool m_bGlueAngles;
279 bool m_bGlueDuckable;
280 qboolean detach_at_death;
281
282 // Path variables
283 float stealthMovementScale; // how much it will notify AIs
284 class pathway_ref *m_BlockedPaths;
285 int m_iNumBlockedPaths;
286
287 // immune list
288 Container<int> immunities;
289
290#ifdef OPM_FEATURES
291 //
292 // Added in OPM
293 //====
294 // miscellaneous
295 bool m_bHintRequiresLookAt;
296 str m_HintString;
297 //====
298#endif
299
300 MulticastDelegate<void (const Event& ev)> delegate_damage;
301 MulticastDelegate<void (const Event& ev)> delegate_killed;
302 MulticastDelegate<void (const Event& ev)> delegate_gotKill;
303
304public:
305
306 Entity();
307 virtual ~Entity();
308
309 void EventGetNormalHealth(Event *ev);
310 void EventNormalDamage(Event *ev);
311 void ClassnameEvent(Event *ev);
312 void SpawnFlagsEvent(Event *ev);
313 void EventRevive(Event *ev);
314
315 virtual void ShowInfo(float fDot, float fDist);
316
317 qboolean DistanceTo(Vector pos) const;
318 qboolean DistanceTo(Entity *ent) const;
319 qboolean WithinDistance(Vector pos, float dist) const;
320 qboolean WithinDistance(Entity *ent, float dist) const;
321
322 Vector GetControllerAngles(int num);
323 void SetControllerAngles(int num, vec3_t angles);
324 void SetControllerAngles(Event *ev);
325 void GetControllerAngles(Event *ev);
326 void SetControllerTag(int num, int tag_num);
327 int GetControllerTag(int num) const;
328 qboolean GetTagPositionAndOrientation(str tagname, orientation_t *new_or);
329 void GetTagPositionAndOrientation(int tagnum, orientation_t *new_or);
330 void GetTagPosition(Event *ev);
331 void GetTagAngles(Event *ev);
332
333 void EventTrace(Event *ev);
334 void EventSightTrace(Event *ev);
335 void EventInPVS(Event *ev);
336 void IsTouching(Event *ev);
337 void IsInside(Event *ev);
338 void CanSeeInternal(Event *ev, bool bNoEnts); // new in 2.0
339 void CanSee(Event *ev);
340 void CanSeeNoEnts(Event *ev);
341
342 void SetKillTarget(const char *killtarget);
343 const char *KillTarget(void);
344
345 void AlwaysDraw(Event *ev);
346 void NormalDraw(Event *ev);
347 void NeverDraw(Event *ev);
348
349 const char *getModel() const;
350 void GetModelEvent(Event *ev);
351 void GetBrushModelEvent(Event *ev);
352 virtual qboolean setModel(void);
353 void SetSize(void);
354 void setModel(const str &mdl);
355 void SetModelEvent(Event *ev);
356
357 void SetTeamEvent(Event *ev);
358 virtual void TriggerEvent(Event *ev);
359 void hideModel(void);
360 void EventHideModel(Event *ev);
361 virtual void showModel(void);
362 void EventShowModel(Event *ev);
363 qboolean hidden(void);
364 void ProcessInitCommands(void);
365
366 void setAlpha(float alpha);
367 float alpha(void);
368
369 void setMoveType(int type);
370 int getMoveType(void);
371
372 void setSolidType(solid_t type);
373 int getSolidType(void);
374
375 virtual void setContentsSolid(void);
376
377 virtual Vector getParentVector(Vector vec);
378 Vector getLocalVector(Vector vec);
379
380 virtual void setSize(Vector min, Vector max);
381 virtual void updateOrigin(void);
382 virtual void setLocalOrigin(Vector org);
383 void setOrigin(Vector org) override;
384 void setOriginEvent(Vector org) override;
385 virtual void setOrigin(void);
386 virtual void addOrigin(Vector org);
387
388 void GetRawTag(int tagnum, orientation_t *orient);
389 qboolean GetRawTag(const char *tagname, orientation_t *orient);
390
391 void GetTag(int tagnum, orientation_t *orient);
392 qboolean GetTag(const char *name, orientation_t *orient);
393 void GetTag(int tagnum, Vector *pos, Vector *forward = NULL, Vector *left = NULL, Vector *up = NULL);
394 qboolean GetTag(const char *name, Vector *pos, Vector *forward = NULL, Vector *left = NULL, Vector *up = NULL);
395
396 virtual int CurrentAnim(int slot = 0) const;
397 virtual float CurrentTime(int slot = 0) const;
398 void ClearAnimSlot(int slot);
399 void StartAnimSlot(int slot, int index, float weight);
400 void RestartAnimSlot(int slot);
401
402 void setAngles(Vector ang) override;
403 virtual void setAngles(void);
404
405 void link(void);
406 void unlink(void);
407
408 void setContents(int type);
409 int getContents(void);
410 void setScale(float scale);
411
412 qboolean droptofloor(float maxfall);
413 qboolean isClient(void);
414
415 virtual void SetDeltaAngles(void);
416 virtual void DamageEvent(Event *event);
417 void Damage(
418 Entity *inflictor,
419 Entity *attacker,
420 float damage,
421 Vector position,
422 Vector direction,
423 Vector normal,
424 int knockback,
425 int flags,
426 int meansofdeath,
427 int location = -1
428 );
429
430 void DamageType(Event *ev);
431 qboolean IsTouching(Entity *e1);
432 qboolean IsInside(Entity *e1);
433 qboolean FovCheck(float *delta, float fovdot);
434 // bNoEnts since 2.0
435 virtual bool CanSee(Entity *ent, float fov, float vision_distance, bool bNoEnts = false);
436 virtual bool CanSee(const Vector& org, float fov, float vision_distance, bool bNoEnts = false); // added in 2.0
437 bool AreasConnected(const Entity *other);
438 void FadeNoRemove(Event *ev);
439 void FadeOut(Event *ev);
440 void FadeIn(Event *ev);
441 void Fade(Event *ev);
442 void Sink(Event *ev);
443
444 virtual void CheckGround(void);
445 virtual qboolean HitSky(trace_t *trace);
446 virtual qboolean HitSky(void);
447
448 void SafeSolid(Event *ev); // new in 2.0
449 void BecomeSolid(Event *ev);
450 void BecomeNonSolid(Event *ev);
451 void SetSize(Event *ev);
452 void SetMins(Event *ev);
453 void SetMaxs(Event *ev);
454 //==
455 // added in 2.0
456 void GetMins(Event *ev);
457 void GetMaxs(Event *ev);
458 //==
459 void SetScale(Event *ev);
460 void GetScale(Event *ev);
461 void SetAlpha(Event *ev);
462 void SetKillTarget(Event *ev);
463 void TouchTriggersEvent(Event *ev);
464
465 str GetRandomAlias(str name, AliasListNode_t **ret);
466 void SetWaterType(void);
467
468 // model binding functions
469 qboolean
470 attach(int parent_entity_num, int tag_num, qboolean use_angles = qtrue, Vector attach_offset = Vector("0 0 0"));
471 void detach(void);
472
473 //
474 // Sound functions
475 //
476 void ProcessSoundEvent(Event *ev, qboolean checkSubtitle);
477 void Sound(Event *ev);
478 virtual void Sound(
479 str sound_name,
480 int channel = CHAN_BODY,
481 float volume = -1.0,
482 float min_dist = -1.0,
483 Vector *origin = NULL,
484 float pitch = -1.0f,
485 int argstype = 0,
486 int doCallback = 0,
487 int checkSubtitle = 1,
488 float max_dist = -1.0f
489 );
490 void StopSound(int channel);
491 void StopSound(Event *ev);
492 void LoopSound(Event *ev);
493 void
494 LoopSound(str sound_name, float volume = -1.0, float min_dist = -1.0, float max_dist = -1.0, float pitch = -1.0);
495 void StopLoopSound(Event *ev);
496 void StopLoopSound(void);
497 void StopAllSounds();
498
499 void SetLight(Event *ev);
500 void LightOn(Event *ev);
501 void LightOff(Event *ev);
502 void LightRed(Event *ev);
503 void LightGreen(Event *ev);
504 void LightBlue(Event *ev);
505 void LightRadius(Event *ev);
506 void LightStyle(Event *ev);
507 void Flags(Event *ev);
508 void Effects(Event *ev);
509 void RenderEffects(Event *ev);
510 void SVFlags(Event *ev);
511
512 void BroadcastAIEvent(int iType = AI_EVENT_MISC, float rad = SOUND_RADIUS);
513 void BroadcastAIEvent(Event *ev);
514 void Kill(Event *ev);
515 virtual void Killed(Event *ev);
516 void SurfaceModelEvent(Event *ev);
517 void SurfaceCommand(const char *surf_name, const char *token);
518 virtual void Postthink(void);
519 virtual void Think(void);
520
521 void DamageSkin(trace_t *trace, float damage);
522
523 void AttachEvent(Event *ev);
524 void AttachModelEvent(Event *ev);
525 void RemoveAttachedModelEvent(Event *ev);
526 void AttachedModelAnimEvent(Event *ev);
527 void DetachEvent(Event *ev);
528 void TakeDamageEvent(Event *ev);
529 void NoDamageEvent(Event *ev);
530 void Gravity(Event *ev);
531 void GiveOxygen(float time);
532 void UseBoundingBoxEvent(Event *ev);
533 void HurtEvent(Event *ev);
534 void HealEvent(Event *ev);
535 void SetMassEvent(Event *ev);
536 void Censor(Event *ev);
537 void Ghost(Event *ev);
538
539 void StationaryEvent(Event *ev);
540 void TossEvent(Event *ev);
541 void Explosion(Event *ev);
542
543 void Shader(Event *ev);
544
545 void KillAttach(Event *ev);
546 void SetBloodModel(Event *ev);
547
548 void DropToFloorEvent(Event *ev);
549
550 // Binding methods
551 void joinTeam(Entity *teammember);
552 void quitTeam(void);
553 qboolean isBoundTo(Entity *master);
554 virtual void bind(Entity *master, qboolean use_my_angles = qfalse);
555 virtual void unbind(void);
556 virtual void glue(Entity *master, qboolean use_my_angles = qtrue, qboolean can_duck = qfalse);
557 virtual void unglue(void);
558 void GlueEvent(Event *ev);
559 void DuckableGlueEvent(Event *ev);
560 void MakeClayPidgeon(Event *ev);
561 void EventUnglue(Event *ev);
562
563 void JoinTeam(Event *ev);
564 void EventQuitTeam(Event *ev);
565 void BindEvent(Event *ev);
566 void EventUnbind(Event *ev);
567 void AddToSoundManager(Event *ev);
568 void NoLerpThisFrame(void);
569
570 virtual void addAngles(Vector add);
571
572 void DeathSinkStart(Event *ev);
573 void DeathSink(Event *ev);
574
575 void DetachAllChildren(Event *ev);
576 void SetMovementStealth(float fStealthScale);
577 void EventMovementStealth(Event *ev);
578
579 virtual void VelocityModified(void);
580
581 qboolean CheckEventFlags(Event *event);
582 void PusherEvent(Event *ev);
583 void SetShaderData(Event *ev);
584
585 void GetVelocity(Event *ev);
586 void SetVelocity(Event *ev);
587 void GetAVelocity(Event *ev);
588 void DoForceActivate(void);
589 void ForceActivate(Event *ev);
590
591 void ConnectPaths(void);
592 void DisconnectPaths(void);
593
594 void EventConnectPaths(Event *ev);
595 void EventDisconnectPaths(Event *ev);
596 virtual void Delete(void);
597 void Remove(Event *ev);
598 void EventSoundDone(Event *ev);
599
600 void VolumeDamage(float damage);
601 void EventVolumeDamage(Event *ev);
602
603 virtual qboolean IsDead() const;
604 virtual void AddImmunity(Event *ev);
605 virtual void RemoveImmunity(Event *ev);
606 qboolean Immune(int meansofdeath);
607
608 virtual void ClientThink(void);
609
610 virtual void EndFrame(void);
611 virtual void CalcBlend(void);
612 void Archive(Archiver &arc) override;
613 virtual bool AutoArchiveModel(void);
614 virtual void PathnodeClaimRevoked(class PathNode *node);
615 virtual qboolean BlocksAIMovement() const;
616 virtual qboolean AIDontFace(void) const;
617 void SetHealth(Event *ev);
618 void GetHealth(Event *ev);
619 void EventSetMaxHealth(Event *ev);
620 void EventGetMaxHealth(Event *ev);
621 void EventSetHealthOnly(Event *ev);
622 void GetYaw(Event *ev);
623
624 virtual void PreAnimate(void);
625 virtual void PostAnimate(void);
626 virtual bool HasVehicle(void) const;
627 void EventGetEntnum(Event *ev);
628 void EventGetClassname(Event *ev);
629 void EventSetRadnum(Event *ev);
630 void EventGetRadnum(Event *ev);
631 void EventSetRotatedBbox(Event *ev);
632 void EventGetRotatedBbox(Event *ev);
633 void MPrintf(const char *msg, ...);
634 void DrawBoundingBox(int showbboxes);
635
636 void EventSinglePlayerCommand(Event *ev);
637 void EventMultiPlayerCommand(Event *ev);
638 void EventRealismModeCommand(Event *ev);
639 void EventSPRealismModeCommand(Event *ev);
640 void EventDMRealismModeCommand(Event *ev);
641 void GetLocalYawFromVector(Event *ev);
642 void EventShootableOnly(Event *ev);
643 void SetShaderTime(Event *ev);
644 void NoTarget(Event *ev);
645
646 //
647 // Custom openmohaa features
648 //
649 void ProcessHint(gentity_t *client, bool bShow);
650 void GetZone(Event *ev);
651 void IsInZone(Event *ev);
652 void SetDepthHack(Event *ev);
653#ifdef OPM_FEATURES
654 void SetHintRequireLookAt(Event *ev);
655 void SetHintString(Event *ev);
656 void SetShader(Event* ev);
657#endif
658 void PlayNonPvsSound(const str& soundName, float volume = 1);
659};
660
661inline void Entity::PreAnimate(void) {}
662
663inline void Entity::PostAnimate(void) {}
664
665inline bool Entity::HasVehicle(void) const
666{
667 return false;
668}
669
670inline int Entity::getSolidType(void)
671
672{
673 return edict->solid;
674}
675
676inline qboolean Entity::DistanceTo(Vector pos) const
677
678{
679 Vector delta;
680
681 delta = origin - pos;
682 return delta.length() != 0 ? qtrue : qfalse;
683}
684
685inline qboolean Entity::DistanceTo(Entity *ent) const
686{
687 Vector delta;
688
689 assert(ent);
690
691 if (!ent) {
692 // "Infinite" distance
693 return 999999;
694 }
695
696 delta = origin - ent->origin;
697 return delta.length() != 0 ? qtrue : qfalse;
698}
699
700inline qboolean Entity::WithinDistance(Vector pos, float dist) const
701{
702 Vector delta;
703
704 delta = origin - pos;
705
706 // check squared distance
707 return ((delta * delta) < (dist * dist)) ? qtrue : qfalse;
708}
709
710inline qboolean Entity::WithinDistance(Entity *ent, float dist) const
711
712{
713 Vector delta;
714
715 assert(ent);
716
717 if (!ent) {
718 return false;
719 }
720
721 delta = origin - ent->origin;
722
723 // check squared distance
724 return ((delta * delta) < (dist * dist));
725}
726
727inline const char *Entity::KillTarget(void)
728
729{
730 return killtarget.c_str();
731}
732
733inline qboolean Entity::hidden(void)
734{
735 if (edict->s.renderfx & RF_DONTDRAW) {
736 return true;
737 }
738 return false;
739}
740
741inline void Entity::GetBrushModelEvent(Event *ev)
742{
743 ev->AddString(model);
744}
745
746inline void Entity::GetModelEvent(Event *ev)
747{
748 if (!edict->tiki) {
749 ev->AddNil();
750 return;
751 }
752
753 const char *name = gi.TIKI_NameForNum(edict->tiki);
754
755 if (!name) {
756 if (model != "") {
757 ev->AddString(model);
758 } else {
759 ev->AddNil();
760 return;
761 }
762 } else {
763 ev->AddString(name);
764 }
765}
766
767inline void Entity::hideModel(void)
768{
769 edict->s.renderfx |= RF_DONTDRAW;
770 if (getSolidType() <= SOLID_TRIGGER) {
771 edict->r.svFlags |= SVF_NOCLIENT;
772 }
773}
774
775inline void Entity::showModel(void)
776{
777 edict->s.renderfx &= ~RF_DONTDRAW;
778 edict->r.svFlags &= ~SVF_NOCLIENT;
779}
780
781inline float Entity::alpha(void)
782
783{
784 return edict->s.alpha;
785}
786
787inline void Entity::setMoveType(int type)
788
789{
790 movetype = type;
791}
792
793inline int Entity::getMoveType(void)
794
795{
796 return movetype;
797}
798
799inline void Entity::unlink(void)
800
801{
802 gi.unlinkentity(edict);
803}
804
805inline void Entity::setContents(int type)
806
807{
808 edict->r.contents = type;
809}
810
811inline int Entity::getContents(void)
812{
813 return edict->r.contents;
814}
815
816inline qboolean Entity::isClient(void)
817{
818 if (client) {
819 return true;
820 }
821 return false;
822}
823
824inline void Entity::SetDeltaAngles(void)
825
826{
827 int i;
828
829 if (client) {
830 for (i = 0; i < 3; i++) {
831 client->ps.delta_angles[i] = ANGLE2SHORT(client->ps.viewangles[i]);
832 }
833 }
834}
835
836inline str Entity::GetRandomAlias(str name, AliasListNode_t **ret)
837{
838 str realname;
839 const char *s;
840
841 if (edict->tiki) {
842 s = gi.Alias_FindRandom(edict->tiki, name.c_str(), ret);
843 } else {
844 s = NULL;
845 }
846
847 if (s) {
848 realname = s;
849 } else {
850 s = gi.GlobalAlias_FindRandom(name.c_str(), ret);
851 if (s) {
852 realname = s;
853 }
854 }
855
856 return realname;
857}
858
859inline bool Entity::AreasConnected(const Entity *other)
860{
861 return gi.AreasConnected(edict->r.areanum, other->edict->r.areanum) != 0;
862}
863
864#include "worldspawn.h"
Definition archive.h:86
Definition container.h:85
Definition entity.h:203
Definition listener.h:246
Definition delegate.h:81
Definition navigate.h:153
Definition safeptr.h:160
Definition scriptmaster.h:42
Definition vector.h:61
Definition navigate.h:81
Definition str.h:77
Definition q_shared.h:1524
Definition q_shared.h:1452