Annotation of quakeworld/progs/subs.qc, revision 1.1

1.1     ! root        1: 
        !             2: 
        !             3: void() SUB_Null = {};
        !             4: 
        !             5: void() SUB_Remove = {remove(self);};
        !             6: 
        !             7: 
        !             8: /*
        !             9: QuakeEd only writes a single float for angles (bad idea), so up and down are
        !            10: just constant angles.
        !            11: */
        !            12: vector() SetMovedir =
        !            13: {
        !            14:        if (self.angles == '0 -1 0')
        !            15:                self.movedir = '0 0 1';
        !            16:        else if (self.angles == '0 -2 0')
        !            17:                self.movedir = '0 0 -1';
        !            18:        else
        !            19:        {
        !            20:                makevectors (self.angles);
        !            21:                self.movedir = v_forward;
        !            22:        }
        !            23:        
        !            24:        self.angles = '0 0 0';
        !            25: };
        !            26: 
        !            27: /*
        !            28: ================
        !            29: InitTrigger
        !            30: ================
        !            31: */
        !            32: void() InitTrigger =
        !            33: {
        !            34: // trigger angles are used for one-way touches.  An angle of 0 is assumed
        !            35: // to mean no restrictions, so use a yaw of 360 instead.
        !            36:        if (self.angles != '0 0 0')
        !            37:                SetMovedir ();
        !            38:        self.solid = SOLID_TRIGGER;
        !            39:        setmodel (self, self.model);    // set size and link into world
        !            40:        self.movetype = MOVETYPE_NONE;
        !            41:        self.modelindex = 0;
        !            42:        self.model = "";
        !            43: };
        !            44: 
        !            45: /*
        !            46: =============
        !            47: SUB_CalcMove
        !            48: 
        !            49: calculate self.velocity and self.nextthink to reach dest from
        !            50: self.origin traveling at speed
        !            51: ===============
        !            52: */
        !            53: void(entity ent, vector tdest, float tspeed, void() func) SUB_CalcMoveEnt =
        !            54: {
        !            55: local entity   stemp;
        !            56:        stemp = self;
        !            57:        self = ent;
        !            58: 
        !            59:        SUB_CalcMove (tdest, tspeed, func);
        !            60:        self = stemp;
        !            61: };
        !            62: 
        !            63: void(vector tdest, float tspeed, void() func) SUB_CalcMove =
        !            64: {
        !            65: local vector   vdestdelta;
        !            66: local float            len, traveltime;
        !            67: 
        !            68:        if (!tspeed)
        !            69:                objerror("No speed is defined!");
        !            70: 
        !            71:        self.think1 = func;
        !            72:        self.finaldest = tdest;
        !            73:        self.think = SUB_CalcMoveDone;
        !            74: 
        !            75:        if (tdest == self.origin)
        !            76:        {
        !            77:                self.velocity = '0 0 0';
        !            78:                self.nextthink = self.ltime + 0.1;
        !            79:                return;
        !            80:        }
        !            81:                
        !            82: // set destdelta to the vector needed to move
        !            83:        vdestdelta = tdest - self.origin;
        !            84:        
        !            85: // calculate length of vector
        !            86:        len = vlen (vdestdelta);
        !            87:        
        !            88: // divide by speed to get time to reach dest
        !            89:        traveltime = len / tspeed;
        !            90: 
        !            91:        if (traveltime < 0.03)
        !            92:                traveltime = 0.03;
        !            93:        
        !            94: // set nextthink to trigger a think when dest is reached
        !            95:        self.nextthink = self.ltime + traveltime;
        !            96: 
        !            97: // scale the destdelta vector by the time spent traveling to get velocity
        !            98:        self.velocity = vdestdelta * (1/traveltime);    // qcc won't take vec/float     
        !            99: };
        !           100: 
        !           101: /*
        !           102: ============
        !           103: After moving, set origin to exact final destination
        !           104: ============
        !           105: */
        !           106: void()  SUB_CalcMoveDone =
        !           107: {
        !           108:        setorigin(self, self.finaldest);
        !           109:        self.velocity = '0 0 0';
        !           110:        self.nextthink = -1;
        !           111:        if (self.think1)
        !           112:                self.think1();
        !           113: };
        !           114: 
        !           115: 
        !           116: /*
        !           117: =============
        !           118: SUB_CalcAngleMove
        !           119: 
        !           120: calculate self.avelocity and self.nextthink to reach destangle from
        !           121: self.angles rotating 
        !           122: 
        !           123: The calling function should make sure self.think is valid
        !           124: ===============
        !           125: */
        !           126: void(entity ent, vector destangle, float tspeed, void() func) SUB_CalcAngleMoveEnt =
        !           127: {
        !           128: local entity           stemp;
        !           129:        stemp = self;
        !           130:        self = ent;
        !           131:        SUB_CalcAngleMove (destangle, tspeed, func);
        !           132:        self = stemp;
        !           133: };
        !           134: 
        !           135: void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove =
        !           136: {
        !           137: local vector   destdelta;
        !           138: local float            len, traveltime;
        !           139: 
        !           140:        if (!tspeed)
        !           141:                objerror("No speed is defined!");
        !           142:                
        !           143: // set destdelta to the vector needed to move
        !           144:        destdelta = destangle - self.angles;
        !           145:        
        !           146: // calculate length of vector
        !           147:        len = vlen (destdelta);
        !           148:        
        !           149: // divide by speed to get time to reach dest
        !           150:        traveltime = len / tspeed;
        !           151: 
        !           152: // set nextthink to trigger a think when dest is reached
        !           153:        self.nextthink = self.ltime + traveltime;
        !           154: 
        !           155: // scale the destdelta vector by the time spent traveling to get velocity
        !           156:        self.avelocity = destdelta * (1 / traveltime);
        !           157:        
        !           158:        self.think1 = func;
        !           159:        self.finalangle = destangle;
        !           160:        self.think = SUB_CalcAngleMoveDone;
        !           161: };
        !           162: 
        !           163: /*
        !           164: ============
        !           165: After rotating, set angle to exact final angle
        !           166: ============
        !           167: */
        !           168: void() SUB_CalcAngleMoveDone =
        !           169: {
        !           170:        self.angles = self.finalangle;
        !           171:        self.avelocity = '0 0 0';
        !           172:        self.nextthink = -1;
        !           173:        if (self.think1)
        !           174:                self.think1();
        !           175: };
        !           176: 
        !           177: 
        !           178: //=============================================================================
        !           179: 
        !           180: void() DelayThink =
        !           181: {
        !           182:        activator = self.enemy;
        !           183:        SUB_UseTargets ();
        !           184:        remove(self);
        !           185: };
        !           186: 
        !           187: /*
        !           188: ==============================
        !           189: SUB_UseTargets
        !           190: 
        !           191: the global "activator" should be set to the entity that initiated the firing.
        !           192: 
        !           193: If self.delay is set, a DelayedUse entity will be created that will actually
        !           194: do the SUB_UseTargets after that many seconds have passed.
        !           195: 
        !           196: Centerprints any self.message to the activator.
        !           197: 
        !           198: Removes all entities with a targetname that match self.killtarget,
        !           199: and removes them, so some events can remove other triggers.
        !           200: 
        !           201: Search for (string)targetname in all entities that
        !           202: match (string)self.target and call their .use function
        !           203: 
        !           204: ==============================
        !           205: */
        !           206: void() SUB_UseTargets =
        !           207: {
        !           208:        local entity t, stemp, otemp, act;
        !           209: 
        !           210: //
        !           211: // check for a delay
        !           212: //
        !           213:        if (self.delay)
        !           214:        {
        !           215:        // create a temp object to fire at a later time
        !           216:                t = spawn();
        !           217:                t.classname = "DelayedUse";
        !           218:                t.nextthink = time + self.delay;
        !           219:                t.think = DelayThink;
        !           220:                t.enemy = activator;
        !           221:                t.message = self.message;
        !           222:                t.killtarget = self.killtarget;
        !           223:                t.target = self.target;
        !           224:                return;
        !           225:        }
        !           226:        
        !           227:        
        !           228: //
        !           229: // print the message
        !           230: //
        !           231:        if (activator.classname == "player" && self.message != "")
        !           232:        {
        !           233:                centerprint (activator, self.message);
        !           234:                if (!self.noise)
        !           235:                        sound (activator, CHAN_VOICE, "misc/talk.wav", 1, ATTN_NORM);
        !           236:        }
        !           237: 
        !           238: //
        !           239: // kill the killtagets
        !           240: //
        !           241:        if (self.killtarget)
        !           242:        {
        !           243:                t = world;
        !           244:                do
        !           245:                {
        !           246:                        t = find (t, targetname, self.killtarget);
        !           247:                        if (!t)
        !           248:                                return;
        !           249:                        remove (t);
        !           250:                } while ( 1 );
        !           251:        }
        !           252:        
        !           253: //
        !           254: // fire targets
        !           255: //
        !           256:        if (self.target)
        !           257:        {
        !           258:                act = activator;
        !           259:                t = world;
        !           260:                do
        !           261:                {
        !           262:                        t = find (t, targetname, self.target);
        !           263:                        if (!t)
        !           264:                        {
        !           265:                                return;
        !           266:                        }
        !           267:                        stemp = self;
        !           268:                        otemp = other;
        !           269:                        self = t;
        !           270:                        other = stemp;
        !           271:                        if (self.use != SUB_Null)
        !           272:                        {
        !           273:                                if (self.use)
        !           274:                                        self.use ();
        !           275:                        }
        !           276:                        self = stemp;
        !           277:                        other = otemp;
        !           278:                        activator = act;
        !           279:                } while ( 1 );
        !           280:        }
        !           281:        
        !           282: 
        !           283: };
        !           284: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.