]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/mapobjects/misc/keys.qc
Merge MR 'Various Q3 and QL map entity features and fixes'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mapobjects / misc / keys.qc
index 89f6fa8f94def1d4f61550cc47a6511d008a2a53..6c52e6a1e7a4b0493cf8096fd4fbe5e2c2f42da3 100644 (file)
@@ -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);
-       }
+               DropToFloor_QC_DelayedInit(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);
 }