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);
}
/*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.
---------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)
{
vector _colormod;
// 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;
_colormod = '0 .9 0';
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';
// find default model
string _model = string_null;
- if (this.itemkeys <= ITEM_KEY_BIT(2)) {
+ if (this.itemkeys <= ITEM_KEY_BIT(2) || this.itemkeys == 0xffffff) {
_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!
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);
+}
+
#endif