djcev.com

//

Git Repos / fte_dogmode / qc / misc / modeltrain.qc

Last update to this file was on 2024-06-15 at 19:50.

Show modeltrain.qc

//==============================================================================
// misc_modeltrain -- was plats.qc
//==============================================================================

//======================================================================
// constants
//======================================================================

#ifdef SSQC
const float TRAIN_STYLE_SINGLEANIM = 1; // modeltrain with one animation

const float TRAIN_ANIMTYPE_FORWARD = 1;
const float TRAIN_ANIMTYPE_BACKFORTH = 2;
#endif

//======================================================================
// fields
//======================================================================

#ifdef SSQC
.float first_frame2;
.float last_frame2;
.float frtime;
.float frtime2;
.float animtype;
.float animtype2;
.float multiplier;

.vector cmins;
.vector cmaxs;

.entity animcontroller;
.entity rotatecontroller;
#endif

//======================================================================
// forward declarations
//======================================================================

#ifdef SSQC
// temp_anim_controller
void() temp_anim_controller_think;
entity(entity own) spawn_temp_anim_controller;
void(entity e) temp_anim_controller_init;
strip void() temp_anim_controller;
#endif

#ifdef SSQC
// temp_rotate_controller
entity(entity own) spawn_temp_rotate_controller;
void(entity e) temp_rotate_controller_init;
strip void() temp_rotate_controller;
#endif

// misc_modeltrain
#if defined(CSQC) || defined(SSQC)
void(entity e) misc_modeltrain_init;
#endif
#ifdef SSQC
void() misc_modeltrain;
#endif

//------------------------------------------------------------------------------

#ifdef SSQC
//----------------------------------------------------------------------
// class temp_anim_controller: base_tempentity
// {
//--------------------------------------------------------------
void() temp_anim_controller_think =
{
local float first, last, step, atype, dir, nextframe;

// train just went from stopped to moving or vice-versa,
// and have both animations set
if (self.state != self.owner.state &&
self.owner.style != TRAIN_STYLE_SINGLEANIM)
{
if (self.owner.state)
// just started moving
self.owner.frame = zeroconvert (
self.owner.first_frame2);
else
// just stopped
self.owner.frame = zeroconvert (
self.owner.first_frame);

// reset back/forth status
self.owner.distance = 1;
self.state = self.owner.state;
}
else
{
if (self.state &&
self.owner.style != TRAIN_STYLE_SINGLEANIM)
{
// moving train animation, if set
first = zeroconvert (self.owner.first_frame2);
last = zeroconvert (self.owner.last_frame2);
atype = self.owner.animtype2;
}
else
{
// stopped/default train animation
first = zeroconvert (self.owner.first_frame);
last = zeroconvert (self.owner.last_frame);
atype = self.owner.animtype;
}

if (first > last)
// reverse direction
step = dir = -1;
else
step = dir = 1;

// back-and-forth is going the other way, so invert
// the step's signal
if (self.owner.distance < 0)
step = step * (-1);

nextframe = self.owner.frame + step;

if (atype == TRAIN_ANIMTYPE_BACKFORTH)
{
if (dir > 0 && (nextframe > last ||
nextframe < first) ||
dir < 0 && (nextframe > first ||
nextframe < last))
{
nextframe = self.owner.frame - step;
self.owner.distance =
self.owner.distance * (-1);
}
}

if (dir > 0)
nextframe = wrap (nextframe, first, last);
else
nextframe = wrap (nextframe, last, first);

self.owner.frame = nextframe;
}

self.think = temp_anim_controller_think;

if (self.state || self.owner.style == TRAIN_STYLE_SINGLEANIM)
self.nextthink = time + self.owner.frtime;
else
self.nextthink = time + self.owner.frtime2;
};

//--------------------------------------------------------------
entity(entity own) spawn_temp_anim_controller =
{
local entity e = spawn ();
e.owner = own;
temp_anim_controller_init (e);
return e;
};

//--------------------------------------------------------------
void(entity e) temp_anim_controller_init =
{
e.classname = "animcontroller";
e.classtype = CT_TEMP_ANIM_CONTROLLER;
e.state = 0;
base_tempentity_init (e);

if (!e.owner)
objerror ("temp_anim_controller_init: no owner!\n");

e.think = temp_anim_controller_think;
e.nextthink = time + 0.2;
};

//--------------------------------------------------------------
strip void() temp_anim_controller =
{
temp_anim_controller_init (self);
};
// };
#endif

#ifdef SSQC
//----------------------------------------------------------------------
// class temp_rotate_controller: base_tempentity
// {
//--------------------------------------------------------------
entity(entity own) spawn_temp_rotate_controller =
{
local entity e = spawn ();
e.owner = own;
temp_rotate_controller_init (e);
return e;
};

//--------------------------------------------------------------
void(entity e) temp_rotate_controller_init =
{
e.classname = "rotatecontroller";
e.classtype = CT_TEMP_ROTATE_CONTROLLER;
base_tempentity_init (e);
};

//--------------------------------------------------------------
strip void() temp_rotate_controller =
{
temp_rotate_controller_init (self);
};
// };
#endif

//----------------------------------------------------------------------
// class misc_modeltrain: base_func_train
// {
#if defined(CSQC) || defined(SSQC)
//--------------------------------------------------------------
void(entity e) misc_modeltrain_init =
{
e.classname = "misc_modeltrain";
e.classtype = CT_MISC_MODELTRAIN;

#ifdef SSQC
precache_model (e.mdl);
base_func_train_init (e);

if (e.spawnflags & TRAIN_NONSOLID)
{
e.solid = SOLID_NOT;
}
else
{
e.solid = SOLID_BBOX;
if (e.cmins == VEC_ORIGIN)
e.cmins = '-8 -8 -8';
if (e.cmaxs == VEC_ORIGIN)
e.cmaxs = '8 8 8';
}

e.movetype = MOVETYPE_NOCLIP;
setmodel (e, e.mdl);
setsize (e, e.cmins , e.cmaxs);
setorigin (e, e.origin);

e.rotatecontroller = spawn_temp_rotate_controller (e);
e.animcontroller = spawn_temp_anim_controller (e);

e.distance = 1;

if (!e.frtime)
e.frtime = 0.1;
if (!e.frtime2)
e.frtime2 = e.frtime;
if (!e.multiplier)
e.multiplier = 1;

// make sure all first and last frame fields are filled
if (e.first_frame && !e.last_frame)
e.last_frame = e.first_frame;
else if (!e.first_frame && e.last_frame)
e.first_frame = e.last_frame;

if (e.first_frame2 && !e.last_frame2)
e.last_frame2 = e.first_frame2;
else if (!e.first_frame2 && e.last_frame2)
e.first_frame2 = e.last_frame2;

if (e.first_frame2 == 0)
e.style = TRAIN_STYLE_SINGLEANIM;

if (!e.animtype)
e.animtype = TRAIN_ANIMTYPE_FORWARD;
if (!e.animtype2)
e.animtype2 = e.animtype;

e.frame = e.first_frame;
#endif
};
#endif

#ifdef SSQC
//--------------------------------------------------------------
void() misc_modeltrain =
{
// new spawnflags for all entities -- iw
if (SUB_Inhibit())
return;

misc_modeltrain_init (self);
};
#endif
// };

Return to the top of this page or return to the overview of this repo.

Log modeltrain.qc

Date Commit Message Author + -
2024-06-15 Major update, committing as-is, will have bugs cev +22  
2024-03-24 2nd pass refactor, rework QC class structure cev +156 -257
2024-01-31 Class based monster refactor & start projectiles cev +10 -10
2024-01-09 Continue OO / Class-based refactor cev +332 -123
2023-12-09 Start OO / class-based refactor, work on items cev +2 -2
2023-11-27 Code reorg, minor movement changes, misc cev +162  

Return to the top of this page or return to the overview of this repo.