]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/mapobjects/trigger/jumppads.qh
7146cc52cb057a3d4d12f19c5664017d0aa71a8f
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mapobjects / trigger / jumppads.qh
1 #pragma once
2
3
4 const int PUSH_ONCE = BIT(0); // legacy, deactivate with relay instead
5 const int PUSH_SILENT = BIT(1); // not used?
6 const int PUSH_STATIC = BIT(12); // xonotic-only, Q3 already behaves like this by default
7
8 #define PUSH_VELOCITY_PLAYERDIR_XY        BIT(0)
9 #define PUSH_VELOCITY_ADD_XY              BIT(1)
10 #define PUSH_VELOCITY_PLAYERDIR_Z         BIT(2)
11 #define PUSH_VELOCITY_ADD_Z               BIT(3)
12 #define PUSH_VELOCITY_BIDIRECTIONAL_XY    BIT(4)
13 #define PUSH_VELOCITY_BIDIRECTIONAL_Z     BIT(5)
14 #define PUSH_VELOCITY_CLAMP_NEGATIVE_ADDS BIT(6)
15
16 IntrusiveList g_jumppads;
17 STATIC_INIT(g_jumppads) { g_jumppads = IL_NEW(); }
18
19 .float pushltime;
20 .bool istypefrag;
21 .float height;
22
23 .entity last_pushed;
24
25 const int NUM_JUMPPADSUSED = 3;
26 .float jumppadcount;
27 .entity jumppadsused[NUM_JUMPPADSUSED];
28
29 #ifdef SVQC
30 void SUB_UseTargets(entity this, entity actor, entity trigger);
31 void trigger_push_use(entity this, entity actor, entity trigger);
32 bool trigger_push_testorigin(entity tracetest_ent, entity targ, entity jp, vector org);
33 bool trigger_push_testorigin_for_item(entity tracetest_ent, entity item, vector org);
34 #endif
35
36 /*
37         trigger_push_calculatevelocity
38
39         Arguments:
40           org - origin of the object which is to be pushed
41           tgt - target entity (can be either a point or a model entity; if it is
42                 the latter, its midpoint is used)
43           ht  - jump height, measured from the higher one of org and tgt's midpoint
44           pushed_entity - object that is to be pushed
45
46         Returns: velocity for the jump
47  */
48 vector trigger_push_calculatevelocity(vector org, entity tgt, float ht, entity pushed_entity);
49
50 void trigger_push_touch(entity this, entity toucher);
51
52 .vector dest;
53 bool trigger_push_test(entity this, entity item);
54 void trigger_push_findtarget(entity this);
55
56 /*
57  * ENTITY PARAMETERS trigger_push:
58  *
59  *   target:  target of jump
60  *   height:  the absolute value is the height of the highest point of the jump
61  *            trajectory above the higher one of the player and the target.
62  *            the sign indicates whether the highest point is INSIDE (positive)
63  *            or OUTSIDE (negative) of the jump trajectory. General rule: use
64  *            positive values for targets mounted on the floor, and use negative
65  *            values to target a point on the ceiling.
66  *   movedir: if target is not set, this * speed * 10 is the velocity to be reached.
67  */
68
69 /*
70  * ENTITY PARAMETERS trigger_push_velocity:
71  *
72  *   target:  this points to the target_position to which the player will jump.
73  *   speed:   XY speed for player-directional velocity pads - either sets or adds to the player's horizontal velocity.
74  *   count:   Z speed for player-directional velocity pads - either sets or adds to the player's vertical velocity.
75  */
76 #ifdef SVQC
77 spawnfunc(trigger_push);
78 spawnfunc(trigger_push_velocity);
79
80 spawnfunc(target_push);
81 spawnfunc(info_notnull);
82 spawnfunc(target_position);
83 #endif