2016-10-11 16:53:10 +00:00
class Actor : Thinker native
{
const DEFAULT_HEALTH = 1000;
2016-11-18 20:34:06 +00:00
const ONFLOORZ = -2147483648.0;
const ONCEILINGZ = 2147483647.0;
const FLOATRANDZ = ONCEILINGZ-1;
2016-11-23 18:47:09 +00:00
const TELEFRAG_DAMAGE = 1000000;
2016-11-25 15:05:03 +00:00
const MinVel = 1./65536;
2016-11-27 20:41:04 +00:00
const LARGE_MASS = 10000000; // not INT_MAX on purpose
2016-11-23 18:47:09 +00:00
2016-11-18 20:34:06 +00:00
2016-11-22 18:20:31 +00:00
// flags are not defined here, the native fields for those get synthesized from the internal tables.
// for some comments on these fields, see their native representations in actor.h.
2016-11-27 17:52:24 +00:00
native readonly Actor snext; // next in sector list.
2016-11-22 18:20:31 +00:00
native PlayerInfo Player;
native readonly vector3 Pos;
native vector3 Prev;
native double spriteAngle;
native double spriteRotation;
native double VisibleStartAngle;
native double VisibleStartPitch;
native double VisibleEndAngle;
native double VisibleEndPitch;
native double Angle;
native double Pitch;
native double Roll;
native vector3 Vel;
native double Speed;
native double FloatSpeed;
native SpriteID sprite;
native uint8 frame;
native vector2 Scale;
native TextureID picnum;
native double Alpha;
native color fillcolor;
native Sector CurSector;
native double CeilingZ;
native double FloorZ;
native double DropoffZ;
native Sector floorsector;
native TextureID floorpic;
native int floorterrain;
native Sector ceilingsector;
native TextureID ceilingpic;
native double Height;
native readonly double Radius;
native double projectilepassheight;
native int tics;
native readonly State CurState;
native readonly int Damage;
native int projectilekickback;
native int special1;
native int special2;
native double specialf1;
native double specialf2;
native int weaponspecial;
native int Health;
native uint8 movedir;
native int8 visdir;
native int16 movecount;
native int16 strafecount;
native Actor Target;
native Actor Master;
native Actor Tracer;
native Actor LastHeard;
native Actor LastEnemy;
native Actor LastLookActor;
native int ReactionTime;
native int Threshold;
native readonly int DefThreshold;
native readonly vector3 SpawnPoint;
native readonly uint16 SpawnAngle;
native int StartHealth;
native uint8 WeaveIndexXY;
native uint8 WeaveIndexZ;
native int skillrespawncount;
native int Args[5];
native int Mass;
native int Special;
native readonly int TID;
native readonly int TIDtoHate;
native readonly int WaterLevel;
native int Score;
native int Accuracy;
native int Stamina;
native double MeleeRange;
native int PainThreshold;
native double Gravity;
native double FloorClip;
native name DamageType;
native name DamageTypeReceived;
native uint8 FloatBobPhase;
native int RipperLevel;
native int RipLevelMin;
native int RipLevelMax;
native name Species;
native Actor Alternative;
native Actor goal;
native uint8 MinMissileChance;
native int8 LastLookPlayerNumber;
native uint SpawnFlags;
native double meleethreshold;
native double maxtargetrange;
native double bouncefactor;
native double wallbouncefactor;
native int bouncecount;
native double friction;
native int FastChaseStrafeCount;
native double pushfactor;
native int lastpush;
native int activationtype;
native int lastbump;
native int DesignatedTeam;
native Actor BlockingMobj;
native int PoisonDamage;
native name PoisonDamageType;
native int PoisonDuration;
native int PoisonPeriod;
native int PoisonDamageReceived;
native name PoisonDamageTypeReceived;
native int PoisonDurationReceived;
native int PoisonPeriodReceived;
native Actor Poisoner;
native Inventory Inv;
native uint8 smokecounter;
native uint8 FriendPlayer;
native uint Translation;
native sound AttackSound;
native sound DeathSound;
native sound SeeSound;
native sound PainSound;
native sound ActiveSound;
native sound UseSound;
native sound BounceSound;
native sound WallBounceSound;
native sound CrushPainSound;
native double MaxDropoffHeight;
native double MaxStepHeight;
native int16 PainChance;
native name PainType;
native name DeathType;
native double DamageFactor;
native double DamageMultiply;
native Class<Actor> TelefogSourceType;
native Class<Actor> TelefogDestType;
native readonly State SpawnState;
native readonly State SeeState;
native State MeleeState;
native State MissileState;
2016-11-24 19:02:44 +00:00
native meta String Obituary; // Player was killed by this actor
native meta String HitObituary; // Player was killed by this actor in melee
native meta double DeathHeight; // Height on normal death
native meta double BurnHeight; // Height on burning death
native meta color BloodColor; // Colorized blood
native meta int GibHealth; // Negative health below which this monster dies an extreme death
native meta int WoundHealth; // Health needed to enter wound state
native meta double FastSpeed; // speed in fast mode
native meta double RDFactor; // Radius damage factor
native meta double CameraHeight; // Height of camera when used as such
native meta Sound HowlSound; // Sound being played when electrocuted or poisoned
native meta Name BloodType; // Blood replacement type
native meta Name BloodType2; // Bloopsplatter replacement type
native meta Name BloodType3; // AxeBlood replacement type
native meta bool DontHurtShooter;
native meta int ExplosionRadius;
native meta int ExplosionDamage;
native meta int MeleeDamage;
native meta Sound MeleeSound;
native meta Name MissileName;
native meta double MissileHeight;
2016-11-22 18:20:31 +00:00
// need some definition work first
//FRenderStyle RenderStyle;
//line_t *BlockingLine; // Line that blocked the last move
//int ConversationRoot; // THe root of the current dialogue
//DecalBase DecalGenerator;
// deprecated things.
native readonly deprecated double X;
native readonly deprecated double Y;
native readonly deprecated double Z;
native readonly deprecated double VelX;
native readonly deprecated double VelY;
native readonly deprecated double VelZ;
native readonly deprecated double MomX;
native readonly deprecated double MomY;
native readonly deprecated double MomZ;
native deprecated double ScaleX;
native deprecated double ScaleY;
//int ConversationRoot; // THe root of the current dialogue;
//FStrifeDialogueNode *Conversation; // [RH] The dialogue to show when this actor is used.;
2016-10-11 16:53:10 +00:00
Default
{
Scale 1;
Health DEFAULT_HEALTH;
Reactiontime 8;
Radius 20;
Height 16;
Mass 100;
RenderStyle 'Normal';
Alpha 1;
MinMissileChance 200;
MeleeRange 64 - 20;
MaxDropoffHeight 24;
MaxStepHeight 24;
BounceFactor 0.7;
WallBounceFactor 0.75;
BounceCount -1;
FloatSpeed 4;
FloatBobPhase -1; // randomly initialize by default
Gravity 1;
Friction 1;
2016-11-11 13:40:32 +00:00
DamageFactor 1.0; // damage multiplier as target of damage.
DamageMultiply 1.0; // damage multiplier as source of damage.
2016-10-11 16:53:10 +00:00
PushFactor 0.25;
WeaveIndexXY 0;
WeaveIndexZ 16;
DesignatedTeam 255;
PainType "Normal";
DeathType "Normal";
TeleFogSourceType "TeleportFog";
TeleFogDestType 'TeleportFog';
RipperLevel 0;
RipLevelMin 0;
RipLevelMax 0;
DefThreshold 100;
BloodType "Blood", "BloodSplatter", "AxeBlood";
ExplosionDamage 128;
MissileHeight 32;
SpriteAngle 0;
SpriteRotation 0;
StencilColor "00 00 00";
VisibleAngles 0, 0;
VisiblePitch 0, 0;
2016-11-14 17:31:12 +00:00
DefaultStateUsage SUF_ACTOR|SUF_OVERLAY;
2016-10-11 16:53:10 +00:00
}
2016-11-27 14:50:58 +00:00
2016-10-11 16:53:10 +00:00
// Functions
2016-10-27 13:53:53 +00:00
2016-11-23 18:47:09 +00:00
// 'parked' global functions.
native static double deltaangle(double ang1, double ang2);
native static double absangle(double ang1, double ang2);
native static Vector2 AngleToVector(double angle, double length = 1);
native static Vector2 RotateVector(Vector2 vec, double angle);
2016-10-27 13:53:53 +00:00
bool IsPointerEqual(int ptr_select1, int ptr_select2)
{
return GetPointer(ptr_select1) == GetPointer(ptr_select2);
}
2016-11-12 08:33:43 +00:00
static double BobSin(double fb)
{
return sin(fb * (180./32)) * 8;
}
2016-11-21 13:59:17 +00:00
virtual native void BeginPlay();
virtual native void Activate(Actor activator);
virtual native void Deactivate(Actor activator);
2016-11-23 20:26:59 +00:00
virtual native int DoSpecialDamage (Actor target, int damage, Name damagetype);
2016-11-26 00:14:47 +00:00
virtual native void Die(Actor source, Actor inflictor, int dmgflags);
virtual native bool Slam(Actor victim);
2016-11-24 12:45:43 +00:00
virtual native bool UseInventory(Inventory item);
2016-11-26 08:51:14 +00:00
virtual native bool SpecialBlastHandling (Actor source, double strength);
2016-10-27 13:53:53 +00:00
2016-11-27 20:41:04 +00:00
virtual int SpecialMissileHit (Actor victim) // for this no native version exists
{
return -1;
}
2016-11-25 15:05:03 +00:00
2016-11-21 12:04:27 +00:00
native static double GetDefaultSpeed(class<Actor> type);
2016-11-27 19:14:43 +00:00
native static class<Actor> GetSpawnableType(int spawnnum);
2016-11-16 00:36:21 +00:00
native void RemoveFromHash();
2016-11-17 15:44:41 +00:00
native string GetTag(string defstr = "");
2016-11-21 12:04:27 +00:00
native double GetBobOffset(double frac = 0);
2016-11-19 23:25:38 +00:00
native void ClearCounters();
native bool GiveBody (int num, int max=0);
2016-11-24 12:45:43 +00:00
native bool HitFloor();
native bool isTeammate(Actor other);
2016-11-25 15:05:03 +00:00
native int PlayerNumber();
2016-11-26 00:14:47 +00:00
native void SetFriendPlayer(PlayerInfo player);
2016-11-26 08:51:14 +00:00
native void NoiseAlert(Actor emitter, bool splash = false, double maxdist = 0);
2016-11-27 09:40:43 +00:00
native void ClearBounce();
2016-11-27 23:49:10 +00:00
native TerrainDef GetFloorTerrain();
2016-11-19 23:25:38 +00:00
2016-11-27 21:14:18 +00:00
native void ExplodeMissile(line lin = null, Actor target = null);
2016-11-23 20:26:59 +00:00
native void RestoreDamage();
2016-11-24 00:23:35 +00:00
native int SpawnHealth();
2016-10-31 16:02:47 +00:00
native void SetDamage(int dmg);
2016-11-12 18:16:47 +00:00
native double Distance2D(Actor other);
2016-10-29 14:49:21 +00:00
native void SetOrigin(vector3 newpos, bool moving);
2016-10-30 13:00:11 +00:00
native void SetXYZ(vector3 newpos);
2016-10-27 13:53:53 +00:00
native Actor GetPointer(int aaptr);
2016-11-12 18:16:47 +00:00
native void FaceMovementDirection();
2016-11-19 12:56:29 +00:00
native double BulletSlope(out FTranslatedLineTarget pLineTarget = null, int aimflags = 0);
2016-11-14 13:12:27 +00:00
native Actor AimTarget();
2016-11-18 20:34:06 +00:00
native bool CheckMissileSpawn(double maxdist);
native bool CheckPosition(Vector2 pos, bool actorsonly = false);
2016-11-24 00:23:35 +00:00
native bool TestMobjLocation();
2016-10-30 13:00:11 +00:00
native static Actor Spawn(class<Actor> type, vector3 pos = (0,0,0), int replace = NO_REPLACE);
2016-10-23 15:15:24 +00:00
native Actor SpawnMissile(Actor dest, class<Actor> type, Actor owner = null);
2016-11-26 23:41:06 +00:00
native Actor SpawnMissileXYZ(Vector3 pos, Actor dest, Class<Actor> type, bool checkspawn = true, Actor owner = null);
2016-11-11 21:14:29 +00:00
native Actor SpawnMissileZ (double z, Actor dest, class<Actor> type);
2016-11-21 12:04:27 +00:00
native Actor SpawnMissileAngleZSpeed (double z, class<Actor> type, double angle, double vz, double speed, Actor owner = null, bool checkspawn = true);
2016-11-20 00:11:01 +00:00
native Actor, Actor SpawnPlayerMissile(class<Actor> type, double angle = 0, double x = 0, double y = 0, double z = 0, out FTranslatedLineTarget pLineTarget = null, bool nofreeaim = false, bool noautoaim = false, int aimflags = 0);
2016-11-24 00:23:35 +00:00
native void SpawnTeleportFog(Vector3 pos, bool beforeTele, bool setTarget);
2016-11-27 23:49:10 +00:00
native Actor RoughMonsterSearch(int distance, bool onlyseekable = false, bool frontonly = false);
2016-11-27 11:52:54 +00:00
native int ApplyDamageFactor(Name damagetype, int damage);
native int GetModifiedDamage(Name damagetype, int damage, bool passive);
2016-11-15 12:39:41 +00:00
2016-11-24 00:23:35 +00:00
void A_Light(int extralight) { if (player) player.extralight = clamp(extralight, -20, 20); }
void A_Light0() { if (player) player.extralight = 0; }
void A_Light1() { if (player) player.extralight = 1; }
void A_Light2() { if (player) player.extralight = 2; }
void A_LightInverse() { if (player) player.extralight = 0x80000000; }
2016-11-11 22:32:13 +00:00
2016-10-30 13:00:11 +00:00
native Actor OldSpawnMissile(Actor dest, class<Actor> type, Actor owner = null);
2016-11-21 12:04:27 +00:00
native Actor SpawnPuff(class<Actor> pufftype, vector3 pos, double hitdir, double particledir, int updown, int flags = 0, Actor vict = null);
2016-11-07 22:16:25 +00:00
2016-11-25 18:52:35 +00:00
native bool Teleport(Vector3 pos, double angle, int flags);
2016-10-23 15:15:24 +00:00
native void TraceBleed(int damage, Actor missile);
2016-11-26 00:14:47 +00:00
native void TraceBleedAngle(int damage, double angle, double pitch);
native void SetIdle(bool nofunction = false);
2016-10-23 15:15:24 +00:00
native bool CheckMeleeRange();
2016-11-27 23:49:10 +00:00
native bool CheckMeleeRange2();
2016-10-23 15:15:24 +00:00
native int DamageMobj(Actor inflictor, Actor source, int damage, Name mod, int flags = 0, double angle = 0);
2016-10-26 09:30:30 +00:00
native double AimLineAttack(double angle, double distance, out FTranslatedLineTarget pLineTarget = null, double vrange = 0., int flags = 0, Actor target = null, Actor friender = null);
native Actor, int LineAttack(double angle, double distance, double pitch, int damage, Name damageType, class<Actor> pufftype, int flags = 0, out FTranslatedLineTarget victim = null);
native bool CheckSight(Actor target, int flags = 0);
native bool HitFriend();
2016-11-12 18:16:47 +00:00
native bool MonsterMove();
2016-11-16 17:47:45 +00:00
native bool TryMove(vector2 newpos, int dropoff);
2016-11-12 18:16:47 +00:00
native void NewChaseDir();
native bool CheckMissileRange();
2016-10-26 09:30:30 +00:00
native bool SetState(state st, bool nofunction = false);
2016-11-25 18:52:35 +00:00
native state FindState(statelabel st, bool exact = false);
2016-11-14 13:12:27 +00:00
bool SetStateLabel(statelabel st, bool nofunction = false) { return SetState(FindState(st), nofunction); }
native action state ResolveState(statelabel st); // this one, unlike FindState, is context aware.
2016-10-27 13:53:53 +00:00
native void LinkToWorld();
native void UnlinkFromWorld();
2016-11-07 22:16:25 +00:00
native bool CanSeek(Actor target);
native double AngleTo(Actor target, bool absolute = false);
2016-11-21 12:04:27 +00:00
native void AddZ(double zadd, bool moving = true);
native void SetZ(double z);
native vector3 Vec3Offset(double x, double y, double z, bool absolute = false);
native vector3 Vec3Angle(double length, double angle, double z = 0, bool absolute = false);
2016-11-26 12:18:48 +00:00
native vector2 Vec2Angle(double length, double angle, bool absolute = false);
2016-11-21 12:04:27 +00:00
native vector3 Vec2OffsetZ(double x, double y, double atz, bool absolute = false);
native void VelFromAngle(double speed = 0, double angle = 0);
native void Thrust(double speed = 0, double angle = 0);
2016-10-27 22:32:52 +00:00
native bool isFriend(Actor other);
2016-11-01 15:32:47 +00:00
native void AdjustFloorClip();
2016-11-03 12:38:40 +00:00
native DropItem GetDropItems();
native void CopyFriendliness (Actor other, bool changeTarget, bool resetHealth = true);
native bool LookForPlayers(bool allaround);
native bool TeleportMove(Vector3 pos, bool telefrag, bool modifyactor = true);
2016-11-06 10:36:12 +00:00
native double DistanceBySpeed(Actor other, double speed);
native name GetSpecies();
2016-11-12 18:16:47 +00:00
native void PlayActiveSound();
2016-11-26 12:18:48 +00:00
native void Howl();
2016-10-26 09:30:30 +00:00
2016-10-23 10:57:21 +00:00
// DECORATE compatible functions
2016-10-11 16:53:10 +00:00
native bool CheckClass(class<Actor> checkclass, int ptr_select = AAPTR_DEFAULT, bool match_superclass = false);
2016-11-19 00:23:56 +00:00
native Inventory FindInventory(class<Inventory> itemtype, bool subclass = false);
2016-11-25 15:05:03 +00:00
native Inventory GiveInventoryType(class<Inventory> itemtype);
2016-11-26 23:18:07 +00:00
native bool GiveAmmo (Class<Ammo> type, int amount);
2016-10-11 16:53:10 +00:00
native int CountInv(class<Inventory> itemtype, int ptr_select = AAPTR_DEFAULT);
2016-11-21 12:04:27 +00:00
native double GetDistance(bool checkz, int ptr = AAPTR_TARGET);
native double GetAngle(int flags, int ptr = AAPTR_DEFAULT);
native double GetZAt(double px = 0, double py = 0, double angle = 0, int flags = 0, int pick_pointer = AAPTR_DEFAULT);
2016-10-11 16:53:10 +00:00
native int GetSpawnHealth();
native int GetGibHealth();
2016-11-21 12:04:27 +00:00
native double GetCrouchFactor(int ptr = AAPTR_PLAYER1);
native double GetCVar(string cvar);
2016-10-11 16:53:10 +00:00
native int GetPlayerInput(int inputnum, int ptr = AAPTR_DEFAULT);
2016-11-21 12:04:27 +00:00
native int CountProximity(class<Actor> classname, double distance, int flags = 0, int ptr = AAPTR_DEFAULT);
native double GetSpriteAngle(int ptr = AAPTR_DEFAULT);
native double GetSpriteRotation(int ptr = AAPTR_DEFAULT);
2016-10-11 16:53:10 +00:00
native int GetMissileDamage(int mask, int add, int ptr = AAPTR_DEFAULT);
action native int OverlayID();
2016-11-21 12:04:27 +00:00
action native double OverlayX(int layer = 0);
action native double OverlayY(int layer = 0);
2016-10-11 16:53:10 +00:00
2016-10-27 13:53:53 +00:00
// DECORATE setters - it probably makes more sense to set these values directly now...
void A_SetMass(int newmass) { mass = newmass; }
2016-11-01 15:32:47 +00:00
void A_SetInvulnerable() { bInvulnerable = true; }
void A_UnSetInvulnerable() { bInvulnerable = false; }
void A_SetReflective() { bReflective = true; }
void A_UnSetReflective() { bReflective = false; }
void A_SetReflectiveInvulnerable() { bInvulnerable = true; bReflective = true; }
2016-11-12 12:11:32 +00:00
void A_UnSetReflectiveInvulnerable() { bInvulnerable = false; bReflective = false; }
2016-11-01 15:32:47 +00:00
void A_SetShootable() { bShootable = true; bNonShootable = false; }
void A_UnSetShootable() { bShootable = false; bNonShootable = true; }
void A_NoGravity() { bNoGravity = true; }
void A_Gravity() { bNoGravity = false; Gravity = 1; }
void A_LowGravity() { bNoGravity = false; Gravity = 0.125; }
2016-11-21 12:04:27 +00:00
void A_SetGravity(double newgravity) { gravity = clamp(newgravity, 0., 10.); }
2016-11-01 15:32:47 +00:00
void A_SetFloorClip() { bFloorClip = true; AdjustFloorClip(); }
void A_UnSetFloorClip() { bFloorClip = false; FloorClip = 0; }
void A_HideThing() { bInvisible = true; }
void A_UnHideThing() { bInvisible = false; }
2016-10-27 13:53:53 +00:00
void A_SetArg(int arg, int val) { if (arg >= 0 && arg < 5) args[arg] = val; }
2016-11-21 12:04:27 +00:00
void A_Turn(double turn = 0) { angle += turn; }
2016-10-27 13:53:53 +00:00
void A_SetDamageType(name newdamagetype) { damagetype = newdamagetype; }
void A_SetSolid() { bSolid = true; }
void A_UnsetSolid() { bSolid = false; }
void A_SetFloat() { bFloat = true; }
void A_UnsetFloat() { bFloat = false; }
void A_SetFloatBobPhase(int bob) { if (bob >= 0 && bob <= 63) FloatBobPhase = bob; }
void A_SetRipperLevel(int level) { RipperLevel = level; }
void A_SetRipMin(int minimum) { RipLevelMin = minimum; }
void A_SetRipMax(int maximum) { RipLevelMax = maximum; }
2016-11-06 08:22:03 +00:00
void A_ScreamAndUnblock() { A_Scream(); A_NoBlocking(); }
void A_ActiveAndUnblock() { A_ActiveSound(); A_NoBlocking(); }
2016-11-11 22:32:13 +00:00
//---------------------------------------------------------------------------
//
// FUNC P_SpawnMissileAngle
//
// Returns NULL if the missile exploded immediately, otherwise returns
// a mobj_t pointer to the missile.
//
//---------------------------------------------------------------------------
2016-11-21 12:04:27 +00:00
Actor SpawnMissileAngle (class<Actor> type, double angle, double vz)
2016-11-11 22:32:13 +00:00
{
return SpawnMissileAngleZSpeed (pos.z + 32 + GetBobOffset(), type, angle, vz, GetDefaultSpeed (type));
}
Actor SpawnMissileAngleZ (double z, class<Actor> type, double angle, double vz)
{
return SpawnMissileAngleZSpeed (z, type, angle, vz, GetDefaultSpeed (type));
}
2016-10-27 13:53:53 +00:00
2016-11-21 12:04:27 +00:00
void A_SetScale(double scalex, double scaley = 0, int ptr = AAPTR_DEFAULT, bool usezero = false)
2016-10-27 13:53:53 +00:00
{
Actor aptr = GetPointer(ptr);
if (aptr)
{
aptr.Scale.X = scalex;
aptr.Scale.Y = scaley != 0 || usezero? scaley : scalex; // use scalex here, too, if only one parameter.
}
}
2016-11-21 12:04:27 +00:00
void A_SetSpeed(double speed, int ptr = AAPTR_DEFAULT)
2016-10-27 13:53:53 +00:00
{
Actor aptr = GetPointer(ptr);
if (aptr) aptr.Speed = speed;
}
2016-11-21 12:04:27 +00:00
void A_SetFloatSpeed(double speed, int ptr = AAPTR_DEFAULT)
2016-10-27 13:53:53 +00:00
{
Actor aptr = GetPointer(ptr);
if (aptr) aptr.FloatSpeed = speed;
}
void A_SetPainThreshold(int threshold, int ptr = AAPTR_DEFAULT)
{
Actor aptr = GetPointer(ptr);
if (aptr) aptr.PainThreshold = threshold;
}
2016-11-21 12:04:27 +00:00
bool A_SetSpriteAngle(double angle = 0, int ptr = AAPTR_DEFAULT)
2016-10-27 13:53:53 +00:00
{
Actor aptr = GetPointer(ptr);
if (!aptr) return false;
aptr.SpriteAngle = angle;
return true;
}
2016-11-21 12:04:27 +00:00
bool A_SetSpriteRotation(double angle = 0, int ptr = AAPTR_DEFAULT)
2016-10-27 13:53:53 +00:00
{
Actor aptr = GetPointer(ptr);
if (!aptr) return false;
aptr.SpriteRotation = angle;
return true;
}
2016-11-21 12:04:27 +00:00
deprecated void A_FaceConsolePlayer(double MaxTurnAngle = 0) {}
2016-10-27 13:53:53 +00:00
void A_SetSpecial(int spec, int arg0 = 0, int arg1 = 0, int arg2 = 0, int arg3 = 0, int arg4 = 0)
{
special = spec;
args[0] = arg0;
args[1] = arg1;
args[2] = arg2;
args[3] = arg3;
args[4] = arg4;
}
void A_ClearTarget()
{
target = null;
lastheard = null;
lastenemy = null;
}
void A_ChangeLinkFlags(int blockmap = FLAG_NO_CHANGE, int sector = FLAG_NO_CHANGE)
{
UnlinkFromWorld();
if (blockmap != FLAG_NO_CHANGE) bNoBlockmap = blockmap;
if (sector != FLAG_NO_CHANGE) bNoSector = sector;
LinkToWorld();
}
2016-10-27 15:47:46 +00:00
// killough 11/98: kill an object
void A_Die(name damagetype = "none")
{
DamageMobj(null, null, health, damagetype, DMG_FORCED);
}
2016-11-16 23:44:43 +00:00
void SpawnDirt (double radius)
{
2016-11-20 17:34:27 +00:00
static const class<Actor> chunks[] = { "Dirt1", "Dirt2", "Dirt3", "Dirt4", "Dirt5", "Dirt6" };
2016-11-16 23:44:43 +00:00
double zo = random[Dirt]() / 128. + 1;
Vector3 pos = Vec3Angle(radius, random[Dirt]() * (360./256), zo);
2016-11-20 17:34:27 +00:00
Actor mo = Spawn (chunks[random[Dirt](0, 5)], pos, ALLOW_REPLACE);
2016-11-16 23:44:43 +00:00
if (mo)
{
mo.Vel.Z = random[Dirt]() / 64.;
}
}
//
// A_SinkMobj
// Sink a mobj incrementally into the floor
//
bool SinkMobj (double speed)
{
if (Floorclip < Height)
{
Floorclip += speed;
return false;
}
return true;
}
//
// A_RaiseMobj
// Raise a mobj incrementally from the floor to
//
bool RaiseMobj (double speed)
{
// Raise a mobj from the ground
if (Floorclip > 0)
{
Floorclip -= speed;
if (Floorclip <= 0)
{
Floorclip = 0;
return true;
}
else
{
return false;
}
}
return true;
}
2016-10-27 22:32:52 +00:00
2016-11-21 12:04:27 +00:00
native void A_Face(Actor faceto, double max_turn = 0, double max_pitch = 270, double ang_offset = 0, double pitch_offset = 0, int flags = 0, double z_ofs = 0);
2016-10-27 22:32:52 +00:00
2016-11-21 12:04:27 +00:00
void A_FaceTarget(double max_turn = 0, double max_pitch = 270, double ang_offset = 0, double pitch_offset = 0, int flags = 0, double z_ofs = 0)
2016-10-27 22:32:52 +00:00
{
A_Face(target, max_turn, max_pitch, ang_offset, pitch_offset, flags, z_ofs);
}
2016-11-21 12:04:27 +00:00
void A_FaceTracer(double max_turn = 0, double max_pitch = 270, double ang_offset = 0, double pitch_offset = 0, int flags = 0, double z_ofs = 0)
2016-10-27 22:32:52 +00:00
{
A_Face(tracer, max_turn, max_pitch, ang_offset, pitch_offset, flags, z_ofs);
}
2016-11-21 12:04:27 +00:00
void A_FaceMaster(double max_turn = 0, double max_pitch = 270, double ang_offset = 0, double pitch_offset = 0, int flags = 0, double z_ofs = 0)
2016-10-27 22:32:52 +00:00
{
A_Face(master, max_turn, max_pitch, ang_offset, pitch_offset, flags, z_ofs);
}
2016-10-11 16:53:10 +00:00
// Action functions
// Meh, MBF redundant functions. Only for DeHackEd support.
2016-10-22 15:49:08 +00:00
native bool A_LineEffect(int boomspecial = 0, int tag = 0);
2016-10-11 16:53:10 +00:00
// End of MBF redundant functions.
2016-10-22 15:49:08 +00:00
native void A_MonsterRail();
native void A_Pain();
2016-11-05 00:19:41 +00:00
native void A_NoBlocking(bool drop = true);
2016-11-01 15:32:47 +00:00
void A_Fall() { A_NoBlocking(); }
2016-10-22 15:49:08 +00:00
native void A_XScream();
native void A_Look();
2016-11-14 13:12:27 +00:00
native void A_Chase(statelabel melee = null, statelabel missile = null, int flags = 0);
2016-10-22 15:49:08 +00:00
native void A_Scream();
native void A_VileChase();
native void A_BossDeath();
native void A_Detonate();
2016-10-11 16:53:10 +00:00
native bool A_CallSpecial(int special, int arg1=0, int arg2=0, int arg3=0, int arg4=0, int arg5=0);
2016-10-22 15:49:08 +00:00
native void A_ActiveSound();
2016-10-11 16:53:10 +00:00
2016-10-22 15:49:08 +00:00
native void A_FastChase();
native void A_FreezeDeath();
native void A_FreezeDeathChunks();
native void A_GenericFreezeDeath();
native void A_PlayerScream();
native void A_SkullPop(class<PlayerChunk> skulltype = "BloodySkull");
native void A_CheckPlayerDone();
2016-10-11 16:53:10 +00:00
2016-10-22 15:49:08 +00:00
native void A_Wander(int flags = 0);
native void A_Look2();
native void A_TossGib();
native void A_SentinelBob();
native void A_SentinelRefire();
native void A_Tracer2();
native void A_SetShadow();
native void A_ClearShadow();
native void A_GetHurt();
native void A_TurretLook();
native void A_KlaxonBlare();
native void A_Countdown();
2016-11-21 12:04:27 +00:00
native void A_AlertMonsters(double maxdist = 0, int flags = 0);
2016-10-22 15:49:08 +00:00
native void A_ClearSoundTarget();
native void A_CheckTerrain();
2016-10-11 16:53:10 +00:00
2016-10-22 15:49:08 +00:00
deprecated native void A_MissileAttack();
deprecated native void A_MeleeAttack();
deprecated native void A_ComboAttack();
deprecated native void A_BulletAttack();
2016-11-21 12:04:27 +00:00
native void A_WolfAttack(int flags = 0, sound whattoplay = "weapons/pistol", double snipe = 1.0, int maxdamage = 64, int blocksize = 128, int pointblank = 2, int longrange = 4, double runspeed = 160.0, class<Actor> pufftype = "BulletPuff");
native void A_PlaySound(sound whattoplay = "weapons/pistol", int slot = CHAN_BODY, double volume = 1.0, bool looping = false, double attenuation = ATTN_NORM, bool local = false);
2016-10-27 13:53:53 +00:00
deprecated void A_PlayWeaponSound(sound whattoplay) { A_PlaySound(whattoplay, CHAN_WEAPON); }
2016-10-22 15:49:08 +00:00
native void A_FLoopActiveSound();
native void A_LoopActiveSound();
native void A_StopSound(int slot = CHAN_VOICE); // Bad default but that's what is originally was...
2016-10-11 16:53:10 +00:00
deprecated native void A_PlaySoundEx(sound whattoplay, name slot, bool looping = false, int attenuation = 0);
deprecated native void A_StopSoundEx(name slot);
native void A_SeekerMissile(int threshold, int turnmax, int flags = 0, int chance = 50, int distance = 10);
2016-11-14 13:12:27 +00:00
native action state A_Jump(int chance, statelabel label, ...);
2016-11-21 12:04:27 +00:00
native void A_CustomMissile(class<Actor> missiletype, double spawnheight = 32, double spawnofs_xy = 0, double angle = 0, int flags = 0, double pitch = 0, int ptr = AAPTR_TARGET);
native void A_CustomBulletAttack(double spread_xy, double spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", double range = 0, int flags = 0, int ptr = AAPTR_TARGET, class<Actor> missile = null, double Spawnheight = 32, double Spawnofs_xy = 0);
native void A_CustomRailgun(int damage, int spawnofs_xy = 0, color color1 = 0, color color2 = 0, int flags = 0, int aim = 0, double maxdiff = 0, class<Actor> pufftype = "BulletPuff", double spread_xy = 0, double spread_z = 0, double range = 0, int duration = 0, double sparsity = 1.0, double driftspeed = 1.0, class<Actor> spawnclass = null, double spawnofs_z = 0, int spiraloffset = 270, int limit = 0);
2016-10-27 13:53:53 +00:00
native bool A_SetInventory(class<Inventory> itemtype, int amount, int ptr = AAPTR_DEFAULT, bool beyondMax = false);
2016-10-11 16:53:10 +00:00
native bool A_GiveInventory(class<Inventory> itemtype, int amount = 0, int giveto = AAPTR_DEFAULT);
native bool A_TakeInventory(class<Inventory> itemtype, int amount = 0, int flags = 0, int giveto = AAPTR_DEFAULT);
2016-11-21 12:04:27 +00:00
action native bool A_SpawnItem(class<Actor> itemtype = "Unknown", double distance = 0, double zheight = 0, bool useammo = true, bool transfer_translation = false);
native bool A_SpawnItemEx(class<Actor> itemtype, double xofs = 0, double yofs = 0, double zofs = 0, double xvel = 0, double yvel = 0, double zvel = 0, double angle = 0, int flags = 0, int failchance = 0, int tid=0);
native void A_Print(string whattoprint, double time = 0, name fontname = "none");
native void A_PrintBold(string whattoprint, double time = 0, name fontname = "none");
2016-10-11 16:53:10 +00:00
native void A_Log(string whattoprint);
native void A_LogInt(int whattoprint);
2016-11-21 12:04:27 +00:00
native void A_LogFloat(double whattoprint);
native void A_SetTranslucent(double alpha, int style = 0);
native void A_SetRenderStyle(double alpha, int style);
native void A_FadeIn(double reduce = 0.1, int flags = 0);
native void A_FadeOut(double reduce = 0.1, int flags = 1); //bool remove == true
native void A_FadeTo(double target, double amount = 0.1, int flags = 0);
native void A_SpawnDebris(class<Actor> spawntype, bool transfer_translation = false, double mult_h = 1, double mult_v = 1);
native void A_SpawnParticle(color color1, int flags = 0, int lifetime = 35, double size = 1, double angle = 0, double xoff = 0, double yoff = 0, double zoff = 0, double velx = 0, double vely = 0, double velz = 0, double accelx = 0, double accely = 0, double accelz = 0, double startalphaf = 1, double fadestepf = -1, double sizestep = 0);
2016-10-11 16:53:10 +00:00
native void A_ExtChase(bool usemelee, bool usemissile, bool playactive = true, bool nightmarefast = false);
native void A_DropInventory(class<Inventory> itemtype);
2016-11-21 12:04:27 +00:00
native void A_SetBlend(color color1, double alpha, int tics, color color2 = 0);
2016-10-25 08:15:24 +00:00
deprecated native void A_ChangeFlag(string flagname, bool value);
native void A_ChangeCountFlags(int kill = FLAG_NO_CHANGE, int item = FLAG_NO_CHANGE, int secret = FLAG_NO_CHANGE);
2016-10-22 15:49:08 +00:00
native void A_RaiseMaster(bool copy = 0);
native void A_RaiseChildren(bool copy = 0);
native void A_RaiseSiblings(bool copy = 0);
2016-11-21 12:04:27 +00:00
deprecated native void A_BasicAttack(int meleedamage, sound meleesound, class<actor> missiletype, double missileheight);
action native bool A_ThrowGrenade(class<Actor> itemtype, double zheight = 0, double xyvel = 0, double zvel = 0, bool useammo = true);
native void A_Weave(int xspeed, int yspeed, double xdist, double ydist);
2016-10-11 16:53:10 +00:00
2016-11-14 13:12:27 +00:00
2016-11-21 12:04:27 +00:00
action native state, bool A_Teleport(statelabel teleportstate = null, class<SpecialSpot> targettype = "BossSpot", class<Actor> fogtype = "TeleportFog", int flags = 0, double mindist = 0, double maxdist = 128, int ptr = AAPTR_DEFAULT);
action native state, bool A_Warp(int ptr_destination, double xofs = 0, double yofs = 0, double zofs = 0, double angle = 0, int flags = 0, statelabel success_state = null, double heightoffset = 0, double radiusoffset = 0, double pitch = 0);
2016-11-14 13:12:27 +00:00
native void A_CountdownArg(int argnum, statelabel targstate = null);
native state A_MonsterRefire(int chance, statelabel label);
2016-11-21 12:04:27 +00:00
native void A_LookEx(int flags = 0, double minseedist = 0, double maxseedist = 0, double maxheardist = 0, double fov = 0, statelabel label = null);
2016-11-14 13:12:27 +00:00
2016-11-21 12:04:27 +00:00
native void A_Recoil(double xyvel);
2016-10-11 16:53:10 +00:00
native bool A_GiveToTarget(class<Inventory> itemtype, int amount = 0, int forward_ptr = AAPTR_DEFAULT);
native bool A_TakeFromTarget(class<Inventory> itemtype, int amount = 0, int flags = 0, int forward_ptr = AAPTR_DEFAULT);
2016-11-21 12:04:27 +00:00
native int A_RadiusGive(class<Inventory> itemtype, double distance, int flags, int amount = 0, class<Actor> filter = null, name species = "None", double mindist = 0, int limit = 0);
2016-10-22 15:49:08 +00:00
native void A_CustomMeleeAttack(int damage = 0, sound meleesound = "", sound misssound = "", name damagetype = "none", bool bleed = true);
2016-11-21 12:04:27 +00:00
native void A_CustomComboAttack(class<Actor> missiletype, double spawnheight, int damage, sound meleesound = "", name damagetype = "none", bool bleed = true);
2016-10-11 16:53:10 +00:00
native void A_Burst(class<Actor> chunktype);
2016-10-22 15:49:08 +00:00
native void A_RadiusThrust(int force = 128, int distance = -1, int flags = RTF_AFFECTSOURCE, int fullthrustdistance = 0);
2016-11-21 12:04:27 +00:00
native void A_RadiusDamageSelf(int damage = 128, double distance = 128, int flags = 0, class<Actor> flashtype = null);
2016-10-22 15:49:08 +00:00
native int A_Explode(int damage = -1, int distance = -1, int flags = XF_HURTSOURCE, bool alert = false, int fulldamagedistance = 0, int nails = 0, int naildamage = 10, class<Actor> pufftype = "BulletPuff", name damagetype = "none");
native void A_Stop();
native void A_Respawn(int flags = 1);
2016-11-19 23:25:38 +00:00
native void A_RestoreSpecialPosition();
2016-10-22 15:49:08 +00:00
native void A_QueueCorpse();
native void A_DeQueueCorpse();
native void A_ClearLastHeard();
2016-10-11 16:53:10 +00:00
native bool A_SelectWeapon(class<Weapon> whichweapon, int flags = 0);
2016-10-22 15:49:08 +00:00
native void A_ClassBossHealth();
native void A_ShootGun();
native void A_RocketInFlight();
native void A_Bang4Cloud();
native void A_DropFire();
2016-10-11 16:53:10 +00:00
native void A_GiveQuestItem(int itemno);
2016-10-22 15:49:08 +00:00
native void A_RemoveForcefield();
2016-11-21 12:04:27 +00:00
native void A_SetAngle(double angle = 0, int flags = 0, int ptr = AAPTR_DEFAULT);
native void A_SetPitch(double pitch, int flags = 0, int ptr = AAPTR_DEFAULT);
native void A_SetRoll(double roll, int flags = 0, int ptr = AAPTR_DEFAULT);
native void A_ScaleVelocity(double scale, int ptr = AAPTR_DEFAULT);
native void A_ChangeVelocity(double x = 0, double y = 0, double z = 0, int flags = 0, int ptr = AAPTR_DEFAULT);
2016-10-14 07:32:45 +00:00
deprecated native void A_SetUserVar(name varname, int value);
deprecated native void A_SetUserArray(name varname, int index, int value);
2016-11-21 12:04:27 +00:00
deprecated native void A_SetUserVarFloat(name varname, double value);
deprecated native void A_SetUserArrayFloat(name varname, int index, double value);
2016-10-11 16:53:10 +00:00
native void A_Quake(int intensity, int duration, int damrad, int tremrad, sound sfx = "world/quake");
2016-11-21 12:04:27 +00:00
native void A_QuakeEx(int intensityX, int intensityY, int intensityZ, int duration, int damrad, int tremrad, sound sfx = "world/quake", int flags = 0, double mulWaveX = 1, double mulWaveY = 1, double mulWaveZ = 1, int falloff = 0, int highpoint = 0, double rollIntensity = 0, double rollWave = 0);
2016-10-11 16:53:10 +00:00
action native void A_SetTics(int tics);
native void A_DropItem(class<Actor> item, int dropamount = -1, int chance = 256);
2016-10-27 13:53:53 +00:00
native void A_DamageSelf(int amount, name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_DamageTarget(int amount, name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_DamageMaster(int amount, name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_DamageTracer(int amount, name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_DamageChildren(int amount, name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_DamageSiblings(int amount, name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_KillTarget(name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_KillMaster(name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_KillTracer(name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_KillChildren(name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_KillSiblings(name damagetype = "none", int flags = 0, class<Actor> filter = null, name species = "None", int src = AAPTR_DEFAULT, int inflict = AAPTR_DEFAULT);
native void A_RemoveTarget(int flags = 0, class<Actor> filter = null, name species = "None");
native void A_RemoveMaster(int flags = 0, class<Actor> filter = null, name species = "None");
native void A_RemoveTracer(int flags = 0, class<Actor> filter = null, name species = "None");
native void A_RemoveChildren(bool removeall = false, int flags = 0, class<Actor> filter = null, name species = "None");
native void A_RemoveSiblings(bool removeall = false, int flags = 0, class<Actor> filter = null, name species = "None");
native void A_Remove(int removee, int flags = 0, class<Actor> filter = null, name species = "None");
2016-10-11 16:53:10 +00:00
native int A_GiveToChildren(class<Inventory> itemtype, int amount = 0);
native int A_GiveToSiblings(class<Inventory> itemtype, int amount = 0);
native int A_TakeFromChildren(class<Inventory> itemtype, int amount = 0);
native int A_TakeFromSiblings(class<Inventory> itemtype, int amount = 0);
native void A_SetTeleFog(class<Actor> oldpos, class<Actor> newpos);
2016-10-22 15:49:08 +00:00
native void A_SwapTeleFog();
2016-10-11 16:53:10 +00:00
native void A_SetHealth(int health, int ptr = AAPTR_DEFAULT);
2016-10-22 15:49:08 +00:00
native void A_ResetHealth(int ptr = AAPTR_DEFAULT);
2016-10-11 16:53:10 +00:00
native void A_SetSpecies(name species, int ptr = AAPTR_DEFAULT);
native void A_SetChaseThreshold(int threshold, bool def = false, int ptr = AAPTR_DEFAULT);
2016-11-21 12:04:27 +00:00
native bool A_FaceMovementDirection(double offset = 0, double anglelimit = 0, double pitchlimit = 0, int flags = 0, int ptr = AAPTR_DEFAULT);
2016-10-22 15:49:08 +00:00
native int A_ClearOverlays(int sstart = 0, int sstop = 0, bool safety = true);
native bool A_CopySpriteFrame(int from, int to, int flags = 0);
2016-11-21 12:04:27 +00:00
native bool A_SetVisibleRotation(double anglestart = 0, double angleend = 0, double pitchstart = 0, double pitchend = 0, int flags = 0, int ptr = AAPTR_DEFAULT);
2016-11-25 15:05:03 +00:00
native void A_SetTranslation(name transname);
2016-10-11 16:53:10 +00:00
native void A_RearrangePointers(int newtarget, int newmaster = AAPTR_DEFAULT, int newtracer = AAPTR_DEFAULT, int flags=0);
native void A_TransferPointer(int ptr_source, int ptr_recepient, int sourcefield, int recepientfield=AAPTR_DEFAULT, int flags=0);
2016-10-22 15:49:08 +00:00
native void A_CopyFriendliness(int ptr_source = AAPTR_MASTER);
2016-10-11 16:53:10 +00:00
2016-11-14 13:12:27 +00:00
action native bool A_Overlay(int layer, statelabel start = null, bool nooverride = false);
2016-11-21 12:04:27 +00:00
native void A_WeaponOffset(double wx = 0, double wy = 32, int flags = 0);
action native void A_OverlayOffset(int layer = PSP_WEAPON, double wx = 0, double wy = 32, int flags = 0);
2016-10-11 16:53:10 +00:00
action native void A_OverlayFlags(int layer, int flags, bool set);
2016-10-27 13:53:53 +00:00
int ACS_NamedExecute(name script, int mapnum=0, int arg1=0, int arg2=0, int arg3=0)
{
return ACS_Execute(-int(script), mapnum, arg1, arg2, arg3);
}
int ACS_NamedSuspend(name script, int mapnum=0)
{
return ACS_Suspend(-int(script), mapnum);
}
int ACS_NamedTerminate(name script, int mapnum=0)
{
return ACS_Terminate(-int(script), mapnum);
}
int ACS_NamedLockedExecute(name script, int mapnum=0, int arg1=0, int arg2=0, int lock=0)
{
return ACS_LockedExecute(-int(script), mapnum, arg1, arg2, lock);
}
int ACS_NamedLockedExecuteDoor(name script, int mapnum=0, int arg1=0, int arg2=0, int lock=0)
{
return ACS_LockedExecuteDoor(-int(script), mapnum, arg1, arg2, lock);
}
int ACS_NamedExecuteWithResult(name script, int arg1=0, int arg2=0, int arg3=0, int arg4=0)
{
return ACS_ExecuteWithResult(-int(script), arg1, arg2, arg3, arg4);
}
int ACS_NamedExecuteAlways(name script, int mapnum=0, int arg1=0, int arg2=0, int arg3=0)
{
return ACS_ExecuteAlways(-int(script), mapnum, arg1, arg2, arg3);
}
2016-10-11 16:53:10 +00:00
2016-11-14 22:24:10 +00:00
States(Actor, Overlay, Weapon, Item)
2016-10-11 16:53:10 +00:00
{
Spawn:
2016-10-12 18:42:41 +00:00
TNT1 A -1;
Stop;
2016-10-11 16:53:10 +00:00
Null:
2016-10-12 18:42:41 +00:00
TNT1 A 1;
Stop;
2016-10-11 16:53:10 +00:00
GenericFreezeDeath:
// Generic freeze death frames. Woo!
2016-10-12 18:42:41 +00:00
#### # 5 A_GenericFreezeDeath;
---- A 1 A_FreezeDeathChunks;
Wait;
2016-10-11 16:53:10 +00:00
GenericCrush:
2016-10-12 18:42:41 +00:00
POL5 A -1;
Stop;
2016-10-11 16:53:10 +00:00
}
// Internal functions
deprecated private native int __decorate_internal_int__(int i);
deprecated private native bool __decorate_internal_bool__(bool b);
2016-11-21 12:04:27 +00:00
deprecated private native double __decorate_internal_float__(double f);
2016-10-11 16:53:10 +00:00
}