OpenMoHAA 0.82.1
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 Entity();
306 virtual ~Entity();
307
308 void EventGetNormalHealth(Event *ev);
309 void EventNormalDamage(Event *ev);
310 void ClassnameEvent(Event *ev);
311 void SpawnFlagsEvent(Event *ev);
312 void EventRevive(Event *ev);
313
314 virtual void ShowInfo(float fDot, float fDist);
315
316 qboolean DistanceTo(Vector pos) const;
317 qboolean DistanceTo(Entity *ent) const;
318 qboolean WithinDistance(Vector pos, float dist) const;
319 qboolean WithinDistance(Entity *ent, float dist) const;
320
321 Vector GetControllerAngles(int num);
322 void SetControllerAngles(int num, vec3_t angles);
323 void SetControllerAngles(Event *ev);
324 void GetControllerAngles(Event *ev);
325 void SetControllerTag(int num, int tag_num);
326 int GetControllerTag(int num) const;
327 qboolean GetTagPositionAndOrientation(str tagname, orientation_t *new_or);
328 void GetTagPositionAndOrientation(int tagnum, orientation_t *new_or);
329 void GetTagPosition(Event *ev);
330 void GetTagAngles(Event *ev);
331
332 void EventTrace(Event *ev);
333 void EventSightTrace(Event *ev);
334 void EventInPVS(Event *ev);
335 void IsTouching(Event *ev);
336 void IsInside(Event *ev);
337 void CanSeeInternal(Event *ev, bool bNoEnts); // new in 2.0
338 void CanSee(Event *ev);
339 void CanSeeNoEnts(Event *ev);
340
341 void SetKillTarget(const char *killtarget);
342 const char *KillTarget(void);
343
344 void AlwaysDraw(Event *ev);
345 void NormalDraw(Event *ev);
346 void NeverDraw(Event *ev);
347
348 const char *getModel() const;
349 void GetModelEvent(Event *ev);
350 void GetBrushModelEvent(Event *ev);
351 virtual qboolean setModel(void);
352 void SetSize(void);
353 void setModel(const str& mdl);
354 void SetModelEvent(Event *ev);
355
356 void SetTeamEvent(Event *ev);
357 virtual void TriggerEvent(Event *ev);
358 void hideModel(void);
359 void EventHideModel(Event *ev);
360 virtual void showModel(void);
361 void EventShowModel(Event *ev);
362 qboolean hidden(void);
363 void ProcessInitCommands(void);
364
365 void setAlpha(float alpha);
366 float alpha(void);
367
368 void setMoveType(int type);
369 int getMoveType(void);
370
371 void setSolidType(solid_t type);
372 int getSolidType(void);
373
374 virtual void setContentsSolid(void);
375
376 virtual Vector getParentVector(Vector vec);
377 Vector getLocalVector(Vector vec);
378
379 virtual void setSize(Vector min, Vector max);
380 virtual void updateOrigin(void);
381 virtual void setLocalOrigin(Vector org);
382 void setOrigin(Vector org) override;
383 void setOriginEvent(Vector org) override;
384 virtual void setOrigin(void);
385 virtual void addOrigin(Vector org);
386
387 void GetRawTag(int tagnum, orientation_t *orient);
388 qboolean GetRawTag(const char *tagname, orientation_t *orient);
389
390 void GetTag(int tagnum, orientation_t *orient);
391 qboolean GetTag(const char *name, orientation_t *orient);
392 void GetTag(int tagnum, Vector *pos, Vector *forward = NULL, Vector *left = NULL, Vector *up = NULL);
393 qboolean GetTag(const char *name, Vector *pos, Vector *forward = NULL, Vector *left = NULL, Vector *up = NULL);
394
395 virtual int CurrentAnim(int slot = 0) const;
396 virtual float CurrentTime(int slot = 0) const;
397 void ClearAnimSlot(int slot);
398 void StartAnimSlot(int slot, int index, float weight);
399 void RestartAnimSlot(int slot);
400
401 void setAngles(Vector ang) override;
402 virtual void setAngles(void);
403
404 void link(void);
405 void unlink(void);
406
407 void setContents(int type);
408 int getContents(void);
409 void setScale(float scale);
410
411 qboolean droptofloor(float maxfall);
412 qboolean isClient(void);
413
414 virtual void SetDeltaAngles(void);
415 virtual void DamageEvent(Event *event);
416 void Damage(
417 Entity *inflictor,
418 Entity *attacker,
419 float damage,
420 Vector position,
421 Vector direction,
422 Vector normal,
423 int knockback,
424 int flags,
425 int meansofdeath,
426 int location = -1
427 );
428
429 void DamageType(Event *ev);
430 qboolean IsTouching(Entity *e1);
431 qboolean IsInside(Entity *e1);
432 qboolean FovCheck(float *delta, float fovdot);
433 // bNoEnts since 2.0
434 virtual bool CanSee(Entity *ent, float fov, float vision_distance, bool bNoEnts = false);
435 virtual bool CanSee(const Vector& org, float fov, float vision_distance, bool bNoEnts = false); // added in 2.0
436 bool AreasConnected(const Entity *other);
437 void FadeNoRemove(Event *ev);
438 void FadeOut(Event *ev);
439 void FadeIn(Event *ev);
440 void Fade(Event *ev);
441 void Sink(Event *ev);
442
443 virtual void CheckGround(void);
444 virtual qboolean HitSky(trace_t *trace);
445 virtual qboolean HitSky(void);
446
447 void SafeSolid(Event *ev); // new in 2.0
448 void BecomeSolid(Event *ev);
449 void BecomeNonSolid(Event *ev);
450 void SetSize(Event *ev);
451 void SetMins(Event *ev);
452 void SetMaxs(Event *ev);
453 //==
454 // added in 2.0
455 void GetMins(Event *ev);
456 void GetMaxs(Event *ev);
457 //==
458 void SetScale(Event *ev);
459 void GetScale(Event *ev);
460 void SetAlpha(Event *ev);
461 void SetKillTarget(Event *ev);
462 void TouchTriggersEvent(Event *ev);
463
464 str GetRandomAlias(str name, AliasListNode_t **ret);
465 void SetWaterType(void);
466
467 // model binding functions
468 qboolean
469 attach(int parent_entity_num, int tag_num, qboolean use_angles = qtrue, Vector attach_offset = Vector("0 0 0"));
470 void detach(void);
471
472 //
473 // Sound functions
474 //
475 void ProcessSoundEvent(Event *ev, qboolean checkSubtitle);
476 void Sound(Event *ev);
477 virtual void Sound(
478 str sound_name,
479 int channel = CHAN_BODY,
480 float volume = -1.0,
481 float min_dist = -1.0,
482 Vector *origin = NULL,
483 float pitch = -1.0f,
484 int argstype = 0,
485 int doCallback = 0,
486 int checkSubtitle = 1,
487 float max_dist = -1.0f
488 );
489 void StopSound(int channel);
490 void StopSound(Event *ev);
491 void LoopSound(Event *ev);
492 void
493 LoopSound(str sound_name, float volume = -1.0, float min_dist = -1.0, float max_dist = -1.0, float pitch = -1.0);
494 void StopLoopSound(Event *ev);
495 void StopLoopSound(void);
496 void StopAllSounds();
497
498 void SetLight(Event *ev);
499 void LightOn(Event *ev);
500 void LightOff(Event *ev);
501 void LightRed(Event *ev);
502 void LightGreen(Event *ev);
503 void LightBlue(Event *ev);
504 void LightRadius(Event *ev);
505 void LightStyle(Event *ev);
506 void Flags(Event *ev);
507 void Effects(Event *ev);
508 void RenderEffects(Event *ev);
509 void SVFlags(Event *ev);
510
511 void BroadcastAIEvent(int iType = AI_EVENT_MISC, float rad = SOUND_RADIUS);
512 void BroadcastAIEvent(Event *ev);
513 void Kill(Event *ev);
514 virtual void Killed(Event *ev);
515 void SurfaceModelEvent(Event *ev);
516 void SurfaceCommand(const char *surf_name, const char *token);
517 virtual void Postthink(void);
518 virtual void Think(void);
519
520 void DamageSkin(trace_t *trace, float damage);
521
522 void AttachEvent(Event *ev);
523 void AttachModelEvent(Event *ev);
524 void RemoveAttachedModelEvent(Event *ev);
525 void AttachedModelAnimEvent(Event *ev);
526 void DetachEvent(Event *ev);
527 void TakeDamageEvent(Event *ev);
528 void NoDamageEvent(Event *ev);
529 void Gravity(Event *ev);
530 void GiveOxygen(float time);
531 void UseBoundingBoxEvent(Event *ev);
532 void HurtEvent(Event *ev);
533 void HealEvent(Event *ev);
534 void SetMassEvent(Event *ev);
535 void Censor(Event *ev);
536 void Ghost(Event *ev);
537
538 void StationaryEvent(Event *ev);
539 void TossEvent(Event *ev);
540 void Explosion(Event *ev);
541
542 void Shader(Event *ev);
543
544 void KillAttach(Event *ev);
545 void SetBloodModel(Event *ev);
546
547 void DropToFloorEvent(Event *ev);
548
549 // Binding methods
550 void joinTeam(Entity *teammember);
551 void quitTeam(void);
552 qboolean isBoundTo(Entity *master);
553 virtual void bind(Entity *master, qboolean use_my_angles = qfalse);
554 virtual void unbind(void);
555 virtual void glue(Entity *master, qboolean use_my_angles = qtrue, qboolean can_duck = qfalse);
556 virtual void unglue(void);
557 void GlueEvent(Event *ev);
558 void DuckableGlueEvent(Event *ev);
559 void MakeClayPidgeon(Event *ev);
560 void EventUnglue(Event *ev);
561
562 void JoinTeam(Event *ev);
563 void EventQuitTeam(Event *ev);
564 void BindEvent(Event *ev);
565 void EventUnbind(Event *ev);
566 void AddToSoundManager(Event *ev);
567 void NoLerpThisFrame(void);
568
569 virtual void addAngles(Vector add);
570
571 void DeathSinkStart(Event *ev);
572 void DeathSink(Event *ev);
573
574 void DetachAllChildren(Event *ev);
575 void SetMovementStealth(float fStealthScale);
576 void EventMovementStealth(Event *ev);
577
578 virtual void VelocityModified(void);
579
580 qboolean CheckEventFlags(Event *event);
581 void PusherEvent(Event *ev);
582 void SetShaderData(Event *ev);
583
584 void GetVelocity(Event *ev);
585 void SetVelocity(Event *ev);
586 void GetAVelocity(Event *ev);
587 void DoForceActivate(void);
588 void ForceActivate(Event *ev);
589
590 void ConnectPaths(void);
591 void DisconnectPaths(void);
592
593 void EventConnectPaths(Event *ev);
594 void EventDisconnectPaths(Event *ev);
595 virtual void Delete(void);
596 void Remove(Event *ev);
597 void EventSoundDone(Event *ev);
598
599 void VolumeDamage(float damage);
600 void EventVolumeDamage(Event *ev);
601
602 virtual qboolean IsDead() const;
603 virtual void AddImmunity(Event *ev);
604 virtual void RemoveImmunity(Event *ev);
605 qboolean Immune(int meansofdeath);
606
607 virtual void ClientThink(void);
608
609 virtual void EndFrame(void);
610 virtual void CalcBlend(void);
611 void Archive(Archiver& arc) override;
612 virtual bool AutoArchiveModel(void);
613 virtual void PathnodeClaimRevoked(class PathNode *node);
614 virtual qboolean BlocksAIMovement() const;
615 virtual qboolean AIDontFace(void) const;
616 void SetHealth(Event *ev);
617 void GetHealth(Event *ev);
618 void EventSetMaxHealth(Event *ev);
619 void EventGetMaxHealth(Event *ev);
620 void EventSetHealthOnly(Event *ev);
621 void GetYaw(Event *ev);
622
623 virtual void PreAnimate(void);
624 virtual void PostAnimate(void);
625 virtual bool HasVehicle(void) const;
626 void EventGetEntnum(Event *ev);
627 void EventGetClassname(Event *ev);
628 void EventSetRadnum(Event *ev);
629 void EventGetRadnum(Event *ev);
630 void EventSetRotatedBbox(Event *ev);
631 void EventGetRotatedBbox(Event *ev);
632 void MPrintf(const char *msg, ...);
633 void DrawBoundingBox(int showbboxes);
634
635 void EventSinglePlayerCommand(Event *ev);
636 void EventMultiPlayerCommand(Event *ev);
637 void EventRealismModeCommand(Event *ev);
638 void EventSPRealismModeCommand(Event *ev);
639 void EventDMRealismModeCommand(Event *ev);
640 void GetLocalYawFromVector(Event *ev);
641 void EventShootableOnly(Event *ev);
642 void SetShaderTime(Event *ev);
643 void NoTarget(Event *ev);
644
645 //
646 // Custom openmohaa features
647 //
648 void ProcessHint(gentity_t *client, bool bShow);
649 void GetZone(Event *ev);
650 void IsInZone(Event *ev);
651 void SetDepthHack(Event *ev);
652#ifdef OPM_FEATURES
653 void SetHintRequireLookAt(Event *ev);
654 void SetHintString(Event *ev);
655 void SetShader(Event *ev);
656#endif
657 void PlayNonPvsSound(const str& soundName, float volume = 1);
658};
659
660inline void Entity::PreAnimate(void) {}
661
662inline void Entity::PostAnimate(void) {}
663
664inline bool Entity::HasVehicle(void) const
665{
666 return false;
667}
668
669inline int Entity::getSolidType(void)
670{
671 return edict->solid;
672}
673
674inline qboolean Entity::DistanceTo(Vector pos) const
675{
676 Vector delta;
677
678 delta = origin - pos;
679 return delta.length() != 0 ? qtrue : qfalse;
680}
681
682inline qboolean Entity::DistanceTo(Entity *ent) const
683{
684 Vector delta;
685
686 assert(ent);
687
688 if (!ent) {
689 // "Infinite" distance
690 return 999999;
691 }
692
693 delta = origin - ent->origin;
694 return delta.length() != 0 ? qtrue : qfalse;
695}
696
697inline qboolean Entity::WithinDistance(Vector pos, float dist) const
698{
699 Vector delta;
700
701 delta = origin - pos;
702
703 // check squared distance
704 return ((delta * delta) < (dist * dist)) ? qtrue : qfalse;
705}
706
707inline qboolean Entity::WithinDistance(Entity *ent, float dist) const
708{
709 Vector delta;
710
711 assert(ent);
712
713 if (!ent) {
714 return false;
715 }
716
717 delta = origin - ent->origin;
718
719 // check squared distance
720 return ((delta * delta) < (dist * dist));
721}
722
723inline const char *Entity::KillTarget(void)
724{
725 return killtarget.c_str();
726}
727
728inline qboolean Entity::hidden(void)
729{
730 if (edict->s.renderfx & RF_DONTDRAW) {
731 return true;
732 }
733 return false;
734}
735
736inline void Entity::GetBrushModelEvent(Event *ev)
737{
738 ev->AddString(model);
739}
740
741inline void Entity::GetModelEvent(Event *ev)
742{
743 if (!edict->tiki) {
744 ev->AddNil();
745 return;
746 }
747
748 const char *name = gi.TIKI_NameForNum(edict->tiki);
749
750 if (!name) {
751 if (model != "") {
752 ev->AddString(model);
753 } else {
754 ev->AddNil();
755 return;
756 }
757 } else {
758 ev->AddString(name);
759 }
760}
761
762inline void Entity::hideModel(void)
763{
764 edict->s.renderfx |= RF_DONTDRAW;
765 if (getSolidType() <= SOLID_TRIGGER) {
766 edict->r.svFlags |= SVF_NOCLIENT;
767 }
768}
769
770inline void Entity::showModel(void)
771{
772 edict->s.renderfx &= ~RF_DONTDRAW;
773 edict->r.svFlags &= ~SVF_NOCLIENT;
774}
775
776inline float Entity::alpha(void)
777{
778 return edict->s.alpha;
779}
780
781inline void Entity::setMoveType(int type)
782{
783 movetype = type;
784}
785
786inline int Entity::getMoveType(void)
787{
788 return movetype;
789}
790
791inline void Entity::unlink(void)
792{
793 gi.unlinkentity(edict);
794}
795
796inline void Entity::setContents(int type)
797{
798 edict->r.contents = type;
799}
800
801inline int Entity::getContents(void)
802{
803 return edict->r.contents;
804}
805
806inline qboolean Entity::isClient(void)
807{
808 if (client) {
809 return true;
810 }
811 return false;
812}
813
814inline void Entity::SetDeltaAngles(void)
815{
816 int i;
817
818 if (client) {
819 for (i = 0; i < 3; i++) {
820 client->ps.delta_angles[i] = ANGLE2SHORT(client->ps.viewangles[i]);
821 }
822 }
823}
824
825inline str Entity::GetRandomAlias(str name, AliasListNode_t **ret)
826{
827 str realname;
828 const char *s;
829
830 if (edict->tiki) {
831 s = gi.Alias_FindRandom(edict->tiki, name.c_str(), ret);
832 } else {
833 s = NULL;
834 }
835
836 if (s) {
837 realname = s;
838 } else {
839 s = gi.GlobalAlias_FindRandom(name.c_str(), ret);
840 if (s) {
841 realname = s;
842 }
843 }
844
845 return realname;
846}
847
848inline bool Entity::AreasConnected(const Entity *other)
849{
850 return gi.AreasConnected(edict->r.areanum, other->edict->r.areanum) != 0;
851}
852
853#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