diff options
| author | xolatile | 2025-07-17 23:28:55 +0200 |
|---|---|---|
| committer | xolatile | 2025-07-17 23:28:55 +0200 |
| commit | c79dda69d6e603500a5681430172b5152041af0a (patch) | |
| tree | c1669442318e77a9ae76009edd5eefcaa69064ce /src/fpsgame/entities.cpp | |
| parent | 5b88d873f42b1cad5c5fd03888cfe45b82da06d6 (diff) | |
| download | xolatile-badassbug-c79dda69d6e603500a5681430172b5152041af0a.tar.xz xolatile-badassbug-c79dda69d6e603500a5681430172b5152041af0a.tar.zst | |
Big changed mentioned in IRC channel...
Diffstat (limited to 'src/fpsgame/entities.cpp')
| -rw-r--r-- | src/fpsgame/entities.cpp | 307 |
1 files changed, 8 insertions, 299 deletions
diff --git a/src/fpsgame/entities.cpp b/src/fpsgame/entities.cpp index c35a0d1..f199c11 100644 --- a/src/fpsgame/entities.cpp +++ b/src/fpsgame/entities.cpp @@ -14,27 +14,10 @@ namespace entities { if(ver <= 30) switch(e.type) { - case FLAG: - case MONSTER: case TELEDEST: - case RESPAWNPOINT: - case BOX: - case BARREL: - case PLATFORM: - case ELEVATOR: e.attr1 = (int(e.attr1)+180)%360; break; } - if(ver <= 31) switch(e.type) - { - case BOX: - case BARREL: - case PLATFORM: - case ELEVATOR: - int yaw = (int(e.attr1)%360 + 360)%360 + 7; - e.attr1 = yaw - yaw%15; - break; - } } #ifndef STANDALONE @@ -99,9 +82,6 @@ namespace entities case I_HEALTH: case I_BOOST: case I_GREENARMOUR: case I_YELLOWARMOUR: case I_QUAD: if(m_noitems) continue; break; - case CARROT: case RESPAWNPOINT: - if(!m_classicsp) continue; - break; } const char *mdl = entmdlname(i); if(!mdl) continue; @@ -129,10 +109,6 @@ namespace entities int revs = 10; switch(e.type) { - case CARROT: - case RESPAWNPOINT: - if(e.attr2) revs = 1; - break; case TELEPORT: if(e.attr2 < 0) continue; break; @@ -204,7 +180,7 @@ namespace entities if(ents.inrange(tp) && ents[tp]->type == TELEPORT) { extentity &e = *ents[tp]; - if(e.attr4 >= 0) + if(e.attr4 >= 0) { int snd = S_TELEPORT, flags = 0; if(e.attr4 > 0) { snd = e.attr4; flags = SND_MAP; } @@ -307,13 +283,6 @@ namespace entities break; } - case RESPAWNPOINT: - if(!m_classicsp || d!=player1 || n==respawnent) break; - respawnent = n; - conoutf(CON_GAMEINFO, "\f2respawn point set!"); - playsound(S_V_RESPAWNPOINT); - break; - case JUMPPAD: { if(d->lastpickup==e->type && lastmillis-d->lastpickupmillis<300) break; @@ -339,7 +308,7 @@ namespace entities { extentity &e = *ents[i]; if(e.type==NOTUSED) continue; - if((!e.spawned() || e.nopickup()) && e.type!=TELEPORT && e.type!=JUMPPAD && e.type!=RESPAWNPOINT) continue; + if((!e.spawned() || e.nopickup()) && e.type!=TELEPORT && e.type!=JUMPPAD) continue; float dist = e.o.dist(o); if(dist<(e.type==TELEPORT ? 16 : 12)) trypickup(i, d); } @@ -377,7 +346,7 @@ namespace entities extentity *e = ents[i]; if(e->type>=I_SHELLS && e->type<=I_QUAD && (!m_noammo || e->type<I_SHELLS || e->type>I_CARTRIDGES)) { - e->setspawned(force || m_sp || !server::delayspawn(e->type)); + e->setspawned(force || !server::delayspawn(e->type)); e->clearnopickup(); } } @@ -385,244 +354,17 @@ namespace entities void setspawn(int i, bool on) { if(ents.inrange(i)) { extentity *e = ents[i]; e->setspawned(on); e->clearnopickup(); } } - extentity *newentity() { return new fpsentity(); } - void deleteentity(extentity *e) { delete (fpsentity *)e; } + extentity *newentity() { return new extentity(); } + void deleteentity(extentity *e) { delete e; } void clearents() { while(ents.length()) deleteentity(ents.pop()); } - enum - { - TRIG_COLLIDE = 1<<0, - TRIG_TOGGLE = 1<<1, - TRIG_ONCE = 0<<2, - TRIG_MANY = 1<<2, - TRIG_DISAPPEAR = 1<<3, - TRIG_AUTO_RESET = 1<<4, - TRIG_RUMBLE = 1<<5, - TRIG_LOCKED = 1<<6, - TRIG_ENDSP = 1<<7 - }; - - static const int NUMTRIGGERTYPES = 32; - - static const int triggertypes[NUMTRIGGERTYPES] = - { - -1, - TRIG_ONCE, // 1 - TRIG_RUMBLE, // 2 - TRIG_TOGGLE, // 3 - TRIG_TOGGLE | TRIG_RUMBLE, // 4 - TRIG_MANY, // 5 - TRIG_MANY | TRIG_RUMBLE, // 6 - TRIG_MANY | TRIG_TOGGLE, // 7 - TRIG_MANY | TRIG_TOGGLE | TRIG_RUMBLE, // 8 - TRIG_COLLIDE | TRIG_TOGGLE | TRIG_RUMBLE, // 9 - TRIG_COLLIDE | TRIG_TOGGLE | TRIG_AUTO_RESET | TRIG_RUMBLE, // 10 - TRIG_COLLIDE | TRIG_TOGGLE | TRIG_LOCKED | TRIG_RUMBLE, // 11 - TRIG_DISAPPEAR, // 12 - TRIG_DISAPPEAR | TRIG_RUMBLE, // 13 - TRIG_DISAPPEAR | TRIG_COLLIDE | TRIG_LOCKED, // 14 - -1 /* reserved 15 */, - -1 /* reserved 16 */, - -1 /* reserved 17 */, - -1 /* reserved 18 */, - -1 /* reserved 19 */, - -1 /* reserved 20 */, - -1 /* reserved 21 */, - -1 /* reserved 22 */, - -1 /* reserved 23 */, - -1 /* reserved 24 */, - -1 /* reserved 25 */, - -1 /* reserved 26 */, - -1 /* reserved 27 */, - -1 /* reserved 28 */, - TRIG_DISAPPEAR | TRIG_RUMBLE | TRIG_ENDSP, // 29 - -1 /* reserved 30 */, - -1 /* reserved 31 */, - }; - - #define validtrigger(type) (triggertypes[(type) & (NUMTRIGGERTYPES-1)]>=0) - #define checktriggertype(type, flag) (triggertypes[(type) & (NUMTRIGGERTYPES-1)] & (flag)) - - static inline void cleartriggerflags(extentity &e) - { - e.flags &= ~(EF_ANIM | EF_NOVIS | EF_NOSHADOW | EF_NOCOLLIDE); - } - - static inline void setuptriggerflags(fpsentity &e) - { - cleartriggerflags(e); - e.flags |= EF_ANIM; - if(checktriggertype(e.attr3, TRIG_COLLIDE|TRIG_DISAPPEAR)) e.flags |= EF_NOSHADOW; - if(!checktriggertype(e.attr3, TRIG_COLLIDE)) e.flags |= EF_NOCOLLIDE; - switch(e.triggerstate) - { - case TRIGGERING: - if(checktriggertype(e.attr3, TRIG_COLLIDE) && lastmillis-e.lasttrigger >= 500) e.flags |= EF_NOCOLLIDE; - break; - case TRIGGERED: - if(checktriggertype(e.attr3, TRIG_COLLIDE)) e.flags |= EF_NOCOLLIDE; - break; - case TRIGGER_DISAPPEARED: - e.flags |= EF_NOVIS | EF_NOCOLLIDE; - break; - } - } - - void resettriggers() - { - loopv(ents) - { - fpsentity &e = *(fpsentity *)ents[i]; - if(e.type != ET_MAPMODEL || !validtrigger(e.attr3)) continue; - e.triggerstate = TRIGGER_RESET; - e.lasttrigger = 0; - setuptriggerflags(e); - } - } - - void unlocktriggers(int tag, int oldstate = TRIGGER_RESET, int newstate = TRIGGERING) - { - loopv(ents) - { - fpsentity &e = *(fpsentity *)ents[i]; - if(e.type != ET_MAPMODEL || !validtrigger(e.attr3)) continue; - if(e.attr4 == tag && e.triggerstate == oldstate && checktriggertype(e.attr3, TRIG_LOCKED)) - { - if(newstate == TRIGGER_RESETTING && checktriggertype(e.attr3, TRIG_COLLIDE) && overlapsdynent(e.o, 20)) continue; - e.triggerstate = newstate; - e.lasttrigger = lastmillis; - if(checktriggertype(e.attr3, TRIG_RUMBLE)) playsound(S_RUMBLE, &e.o); - } - } - } - - ICOMMAND(trigger, "ii", (int *tag, int *state), - { - if(*state) unlocktriggers(*tag); - else unlocktriggers(*tag, TRIGGERED, TRIGGER_RESETTING); - }); - - VAR(triggerstate, -1, 0, 1); - - void doleveltrigger(int trigger, int state) - { - defformatstring(aliasname, "level_trigger_%d", trigger); - if(identexists(aliasname)) - { - triggerstate = state; - execident(aliasname); - } - } - - void checktriggers() - { - if(player1->state != CS_ALIVE) return; - vec o = player1->feetpos(); - loopv(ents) - { - fpsentity &e = *(fpsentity *)ents[i]; - if(e.type != ET_MAPMODEL || !validtrigger(e.attr3)) continue; - switch(e.triggerstate) - { - case TRIGGERING: - case TRIGGER_RESETTING: - if(lastmillis-e.lasttrigger>=1000) - { - if(e.attr4) - { - if(e.triggerstate == TRIGGERING) unlocktriggers(e.attr4); - else unlocktriggers(e.attr4, TRIGGERED, TRIGGER_RESETTING); - } - if(checktriggertype(e.attr3, TRIG_DISAPPEAR)) e.triggerstate = TRIGGER_DISAPPEARED; - else if(e.triggerstate==TRIGGERING && checktriggertype(e.attr3, TRIG_TOGGLE)) e.triggerstate = TRIGGERED; - else e.triggerstate = TRIGGER_RESET; - } - setuptriggerflags(e); - break; - case TRIGGER_RESET: - if(e.lasttrigger) - { - if(checktriggertype(e.attr3, TRIG_AUTO_RESET|TRIG_MANY|TRIG_LOCKED) && e.o.dist(o)-player1->radius>=(checktriggertype(e.attr3, TRIG_COLLIDE) ? 20 : 12)) - e.lasttrigger = 0; - break; - } - else if(e.o.dist(o)-player1->radius>=(checktriggertype(e.attr3, TRIG_COLLIDE) ? 20 : 12)) break; - else if(checktriggertype(e.attr3, TRIG_LOCKED)) - { - if(!e.attr4) break; - doleveltrigger(e.attr4, -1); - e.lasttrigger = lastmillis; - break; - } - e.triggerstate = TRIGGERING; - e.lasttrigger = lastmillis; - setuptriggerflags(e); - if(checktriggertype(e.attr3, TRIG_RUMBLE)) playsound(S_RUMBLE, &e.o); - if(checktriggertype(e.attr3, TRIG_ENDSP)) endsp(false); - if(e.attr4) doleveltrigger(e.attr4, 1); - break; - case TRIGGERED: - if(e.o.dist(o)-player1->radius<(checktriggertype(e.attr3, TRIG_COLLIDE) ? 20 : 12)) - { - if(e.lasttrigger) break; - } - else if(checktriggertype(e.attr3, TRIG_AUTO_RESET)) - { - if(lastmillis-e.lasttrigger<6000) break; - } - else if(checktriggertype(e.attr3, TRIG_MANY)) - { - e.lasttrigger = 0; - break; - } - else break; - if(checktriggertype(e.attr3, TRIG_COLLIDE) && overlapsdynent(e.o, 20)) break; - e.triggerstate = TRIGGER_RESETTING; - e.lasttrigger = lastmillis; - setuptriggerflags(e); - if(checktriggertype(e.attr3, TRIG_RUMBLE)) playsound(S_RUMBLE, &e.o); - if(checktriggertype(e.attr3, TRIG_ENDSP)) endsp(false); - if(e.attr4) doleveltrigger(e.attr4, 0); - break; - } - } - } - - void animatemapmodel(const extentity &e, int &anim, int &basetime) - { - const fpsentity &f = (const fpsentity &)e; - if(validtrigger(f.attr3)) switch(f.triggerstate) - { - case TRIGGER_RESET: anim = ANIM_TRIGGER|ANIM_START; break; - case TRIGGERING: anim = ANIM_TRIGGER; basetime = f.lasttrigger; break; - case TRIGGERED: anim = ANIM_TRIGGER|ANIM_END; break; - case TRIGGER_RESETTING: anim = ANIM_TRIGGER|ANIM_REVERSE; basetime = f.lasttrigger; break; - } - } - void fixentity(extentity &e) { - switch(e.type) - { - case FLAG: - case BOX: - case BARREL: - case PLATFORM: - case ELEVATOR: - e.attr5 = e.attr4; - e.attr4 = e.attr3; - case TELEDEST: - e.attr3 = e.attr2; - case MONSTER: - e.attr2 = e.attr1; - case RESPAWNPOINT: - e.attr1 = (int)player1->yaw; - break; - } + if(e.type == TELEDEST) e.attr3 = e.attr2; } void entradius(extentity &e, bool color) @@ -641,23 +383,7 @@ namespace entities renderentarrow(e, vec((int)(char)e.attr3*10.0f, (int)(char)e.attr2*10.0f, e.attr1*12.5f).normalize(), 4); break; - case FLAG: - case MONSTER: - case TELEDEST: - case RESPAWNPOINT: - case BOX: - case BARREL: - case PLATFORM: - case ELEVATOR: - { - vec dir; - vecfromyawpitch(e.attr1, 0, 1, 0, dir); - renderentarrow(e, dir, 4); - break; - } - case MAPMODEL: - if(validtrigger(e.attr3)) renderentring(e, checktriggertype(e.attr3, TRIG_COLLIDE) ? 20 : 12); - break; + default: break; } } @@ -675,11 +401,7 @@ namespace entities "shells", "bullets", "rockets", "riflerounds", "grenades", "cartridges", "health", "healthboost", "greenarmour", "yellowarmour", "quaddamage", "teleport", "teledest", - "monster", "carrot", "jumppad", - "base", "respawnpoint", - "box", "barrel", - "platform", "elevator", - "flag", + "jumppad", "", "", "", "", }; return i>=0 && size_t(i)<sizeof(entnames)/sizeof(entnames[0]) ? entnames[i] : ""; @@ -688,22 +410,9 @@ namespace entities void editent(int i, bool local) { extentity &e = *ents[i]; - if(e.type == ET_MAPMODEL && validtrigger(e.attr3)) - { - fpsentity &f = (fpsentity &)e; - f.triggerstate = TRIGGER_RESET; - f.lasttrigger = 0; - setuptriggerflags(f); - } - else cleartriggerflags(e); if(local) addmsg(N_EDITENT, "rii3ii5", i, (int)(e.o.x*DMF), (int)(e.o.y*DMF), (int)(e.o.z*DMF), e.type, e.attr1, e.attr2, e.attr3, e.attr4, e.attr5); } - float dropheight(entity &e) - { - if(e.type==BASE || e.type==FLAG) return 0.0f; - return 4.0f; - } #endif } |
