X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmapobjects%2Fmisc%2Fkeys.qc;h=df80bc03cba81e0c01debc9b5cb15444fe34ac24;hb=6ececc748777df4af471949f462ead5c8b8ba1df;hp=89f6fa8f94def1d4f61550cc47a6511d008a2a53;hpb=ad464bb5417768682f9989dd025871d14a438e68;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/mapobjects/misc/keys.qc b/qcsrc/common/mapobjects/misc/keys.qc index 89f6fa8f9..df80bc03c 100644 --- a/qcsrc/common/mapobjects/misc/keys.qc +++ b/qcsrc/common/mapobjects/misc/keys.qc @@ -112,19 +112,21 @@ void spawn_item_key(entity this) this.mdl = this.model; this.effects = EF_LOWPRECISION; _setmodel(this, this.model); + this.modelflags |= MF_ROTATE; + this.solid = SOLID_TRIGGER; + + // The origin.z was raised within the bbox to support the current model //setsize(this, '-16 -16 -24', '16 16 32'); setorigin(this, this.origin + '0 0 32'); setsize(this, '-16 -16 -56', '16 16 0'); - this.modelflags |= MF_ROTATE; - this.solid = SOLID_TRIGGER; + if (Q3COMPAT_COMMON) // QL compat, Q3 has no keys + // QL bbox is '-16 -16 -16' '16 16 16' so raise to match QL absmin.z + setorigin(this, this.origin + '0 0 8'); + + // NOTE: this isn't an FL_ITEM so it doesn't get the special treatment in DropToFloor_QC() if (!this.noalign) - { - // first nudge it off the floor a little bit to avoid math errors - setorigin(this, this.origin + '0 0 1'); - // note droptofloor returns false if stuck/or would fall too far droptofloor(this); - } settouch(this, item_key_touch); } @@ -132,16 +134,19 @@ void spawn_item_key(entity this) /*QUAKED item_key (0 .5 .8) (-16 -16 -24) (16 16 32) FLOATING A key entity. -The itemkeys should contain one of the following key IDs: +The itemkeys bitfield should contain one of the following key IDs: 1 - GOLD key - 2 - SILVER key 4 - BRONZE key 8 - RED keycard 16 - BLUE keycard 32 - GREEN keycard +16777215 (0xffffff) - MASTER key (all 24 bits set) Custom keys: -... - last key is 1<<23 -Keys with bigger Id than 32 don't have a default netname and model, if you use one of them, you MUST provide those. + - first key ID is 64 + - last key ID is 8388608 (1<<23 or 0x800000) +Keys (other than master keys) with bigger ID than 32 don't have a default netname and model, +if you use one of them, you MUST provide those. -----------KEYS------------ colormod: color of the key (default: '.9 .9 .9'). itemkeys: a key Id. @@ -154,15 +159,18 @@ FLOATING: the item will float in air, instead of aligning to the floor by fallin ---------NOTES---------- This is the only correct way to put keys on the map! -itemkeys MUST always have exactly one bit set. +itemkeys MUST always have exactly one bit set (unless it's a master key). */ spawnfunc(item_key) { string _netname; vector _colormod; + string _model = "models/keys/key.md3"; // reject this entity if more than one key was set! - if (this.itemkeys>0 && (this.itemkeys & (this.itemkeys-1)) != 0) { + if (this.itemkeys>0 && (this.itemkeys & (this.itemkeys-1)) != 0) + if (this.itemkeys != 0xffffff) // unless it's a master key + { objerror(this, "item_key.itemkeys must contain only 1 bit set specifying the key it represents!"); delete(this); return; @@ -188,44 +196,46 @@ spawnfunc(item_key) case BIT(3): _netname = "RED keycard"; _colormod = '.9 0 0'; + _model = "models/keys/key.md3"; // FIXME: replace it by a keycard model! break; case BIT(4): _netname = "BLUE keycard"; _colormod = '0 0 .9'; + _model = "models/keys/key.md3"; // FIXME: replace it by a keycard model! break; case BIT(5): _netname = "GREEN keycard"; _colormod = '0 .9 0'; + _model = "models/keys/key.md3"; // FIXME: replace it by a keycard model! + break; + + case 0xffffff: // an unlisted key... + _netname = "MASTER key"; + _colormod = '1 0.25 0.25'; break; default: _netname = "FLUFFY PINK keycard"; _colormod = '1 1 1'; - if (this.netname == "") { + if (this.netname == "") + { objerror(this, "item_key doesn't have a default name for this key and a custom one was not specified!"); delete(this); return; } + if (this.model == "") + { + objerror(this, "item_key doesn't have a default model for this key and a custom one was not specified!"); + delete(this); + return; + } break; - } - // find default model - string _model = string_null; - if (this.itemkeys <= ITEM_KEY_BIT(2)) { - _model = "models/keys/key.md3"; - } else if (this.itemkeys >= ITEM_KEY_BIT(3) && this.itemkeys <= ITEM_KEY_BIT(5)) { - _model = "models/keys/key.md3"; // FIXME: replace it by a keycard model! - } else if (this.model == "") { - objerror(this, "item_key doesn't have a default model for this key and a custom one was not specified!"); - delete(this); - return; - } - - // set defailt netname + // set default netname if (this.netname == "") this.netname = _netname; @@ -265,7 +275,7 @@ Don't use this entity on new maps! Use item_key instead. */ spawnfunc(item_key1) { - this.itemkeys = ITEM_KEY_BIT(1); + this.itemkeys = BIT(1); spawnfunc_item_key(this); } @@ -283,7 +293,43 @@ Don't use this entity on new maps! Use item_key instead. */ spawnfunc(item_key2) { - this.itemkeys = ITEM_KEY_BIT(0); + this.itemkeys = BIT(0); + spawnfunc_item_key(this); +} + + // Quake Live Keys +/*QUAKED item_key_gold (1 .66 0) (-16 -16 -16) (16 16 16) SUSPENDED */ +spawnfunc(item_key_gold) +{ + this.itemkeys = BIT(0); + spawnfunc_item_key(this); +} +/*QUAKED item_key_silver (.56 .56 .56) (-16 -16 -16) (16 16 16) SUSPENDED */ +spawnfunc(item_key_silver) +{ + this.itemkeys = BIT(1); + spawnfunc_item_key(this); +} +/*QUAKED item_key_master (1 0 0) (-16 -16 -16) (16 16 16) SUSPENDED +Master key, opens silver and gold doors. + +-------- KEYS -------- +target : picking up the item will trigger the entity this points to. +targetname : a target_give entity can point to this for respawn freebies. +notfree : when set to 1, entity will not spawn in "Free for all", "Race", and "Duel" modes. +notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes. +notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode). +not_gametype : space delineated list of gametype shortnames (ffa duel race tdm ca ctf 1f ob har ft dom ad rr) in which to inhibit the entity. +gametype : space delineated list of gametype shortnames (ffa duel race tdm ca ctf 1f ob har ft dom ad rr) to only spawn entity in this gametype. +notbot : when set to 1, used to make an item invisible for bot attraction. + +-------- SPAWNFLAGS -------- +1 = suspended : item will spawn where it was placed in map and won't drop to the floor. +*/ +spawnfunc(item_key_master) +{ + // We have more key types than QL, may as well open them all. + this.itemkeys = 0xffffff; spawnfunc_item_key(this); }