Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
animdecide.qh
Go to the documentation of this file.
1#pragma once
2
3// must be called at least once to initialize, or when modelindex is changed
5
6// client side frame inferring
7void animdecide_setimplicitstate(entity e, float onground);
8void animdecide_setframes(entity e, bool support_blending, .int fld_frame, .int fld_frame1time, .int fld_frame2, .int fld_frame2time);
9
11 ATTRIB(Animation, m_framenames, string);
12 STATIC_METHOD(Animation, getframe, int(Animation this, int mdlidx))
13 {
14 FOREACH_WORD(this.m_framenames, true, {
15 int f = frameforname(mdlidx, it);
16 if (f != -1) return f;
17 });
18#ifdef CSQC
19 LOG_DEBUGF("Missing animation for %s: %s", modelnameforindex(mdlidx), this.registered_id);
20#endif
21 return -1;
22 }
24
25REGISTRY(Animations, BITS(8))
26REGISTER_REGISTRY(Animations)
27
28REGISTRY_DEFINE_GET(Animations, NULL)
29#define WriteAnimation(to, it) WriteRegistered(Animations, to, it)
30#define ReadAnimation() ReadRegistered(Animations)
31#define REGISTER_ANIMATION(id, framenames) \
32 .vector anim_##id; \
33 REGISTER(Animations, ANIM_##id, m_id, NEW(Animation)) { \
34 this.m_framenames = framenames; \
35 }
36
37vector anim_vec(Animation anim, int mdlidx, int numframes, float framerate)
38{
39 vector v;
40 v.x = Animation_getframe(anim, mdlidx);
41 v.y = numframes;
42 v.z = framerate;
43 return v;
44}
45
46// player animation data for this model
47// each vector is as follows:
48// _x = startframe
49// _y = numframes
50// _z = framerate
52REGISTER_ANIMATION(die1, "dieone groupified_0_anim");
54REGISTER_ANIMATION(die2, "dietwo groupified_1_anim");
56REGISTER_ANIMATION(draw, "draw groupified_2_anim");
57REGISTER_ANIMATION(duck, "duck groupified_3_anim");
59REGISTER_ANIMATION(duckwalk, "duckwalk groupified_4_anim");
61REGISTER_ANIMATION(duckjump, "duckjump groupified_5_anim");
63REGISTER_ANIMATION(duckidle, "duckidle groupified_6_anim");
65REGISTER_ANIMATION(idle, "idle groupified_7_anim");
67REGISTER_ANIMATION(jump, "jump groupified_8_anim");
69REGISTER_ANIMATION(pain1, "painone groupified_9_anim");
71REGISTER_ANIMATION(pain2, "paintwo groupified_10_anim");
73REGISTER_ANIMATION(shoot, "shoot groupified_11_anim");
75REGISTER_ANIMATION(taunt, "taunt groupified_12_anim");
77REGISTER_ANIMATION(run, "run groupified_13_anim");
79REGISTER_ANIMATION(runbackwards, "runbackwards groupified_14_anim");
81REGISTER_ANIMATION(strafeleft, "strafeleft groupified_15_anim");
83REGISTER_ANIMATION(straferight, "straferight groupified_16_anim");
85REGISTER_ANIMATION(dead1, "deadone groupified_17_anim");
87REGISTER_ANIMATION(dead2, "deadtwo groupified_18_anim");
89REGISTER_ANIMATION(forwardright, "forwardright groupified_19_anim");
91REGISTER_ANIMATION(forwardleft, "forwardleft groupified_20_anim");
93REGISTER_ANIMATION(backright, "backright groupified_21_anim");
95REGISTER_ANIMATION(backleft, "backleft groupified_22_anim");
97REGISTER_ANIMATION(melee, "melee groupified_23_anim");
98REGISTER_ANIMATION(duckwalkbackwards, "duckwalkbackwards groupified_24_anim");
99REGISTER_ANIMATION(duckwalkstrafeleft, "duckwalkstrafeleft duckstrafeleft groupified_25_anim");
100REGISTER_ANIMATION(duckwalkstraferight, "duckwalkstraferight duckstraferight groupified_26_anim");
101REGISTER_ANIMATION(duckwalkforwardright, "duckwalkforwardright duckforwardright groupified_27_anim");
102REGISTER_ANIMATION(duckwalkforwardleft, "duckwalkforwardleft groupified_28_anim");
103REGISTER_ANIMATION(duckwalkbackright, "duckwalkbackright duckbackwardright groupified_29_anim");
104REGISTER_ANIMATION(duckwalkbackleft, "duckwalkbackleft duckbackwardleft groupified_30_anim");
106
107// please network this one
114
115// when copying entities, copy these too
122
123// explicit anim states (networked)
124void animdecide_setstate(entity e, int newstate, float restart);
125const int ANIMSTATE_DEAD1 = BIT(0); // base frames: die1
126const int ANIMSTATE_DEAD2 = BIT(1); // base frames: die2
127const int ANIMSTATE_DUCK = BIT(2); // turns walk into duckwalk, jump into duckjump, etc.
128const int ANIMSTATE_FROZEN = BIT(3); // force idle
129const int ANIMSTATE_FOLLOW = BIT(4); // also force idle
130
131// implicit anim states (inferred from velocity, etc.)
138
139// explicit actions (networked); negative values are for lower body
140void animdecide_setaction(entity e, float action, float restart);
141const int ANIMACTION_JUMP = -1; // jump
142const int ANIMACTION_DRAW = 1; // draw
143const int ANIMACTION_PAIN1 = 2; // pain
144const int ANIMACTION_PAIN2 = 3; // pain
145const int ANIMACTION_SHOOT = 4; // shoot
146const int ANIMACTION_TAUNT = 5; // taunt
147const int ANIMACTION_MELEE = 6; // melee
const int ANIMSTATE_FROZEN
const int ANIMACTION_MELEE
float anim_lower_implicit_time
const int ANIMIMPLICITSTATE_LEFT
const int ANIMACTION_DRAW
const int ANIMSTATE_DEAD1
float anim_lower_time
float animdecide_modelindex
float anim_implicit_time
void animdecide_setimplicitstate(entity e, float onground)
const int ANIMIMPLICITSTATE_INAIR
void animdecide_setframes(entity e, bool support_blending,.int fld_frame,.int fld_frame1time,.int fld_frame2,.int fld_frame2time)
float anim_upper_implicit_action
const int ANIMIMPLICITSTATE_JUMPRELEASED
float anim_lower_implicit_action
float anim_upper_time
const int ANIMIMPLICITSTATE_FORWARD
#define REGISTER_ANIMATION(id, framenames)
Definition animdecide.qh:31
int anim_state
const int ANIMSTATE_FOLLOW
void animdecide_load_if_needed(entity e)
Definition animdecide.qc:53
const int ANIMACTION_TAUNT
const int ANIMACTION_JUMP
float anim_upper_action
float anim_time
const int ANIMACTION_PAIN2
void animdecide_setstate(entity e, int newstate, float restart)
int anim_implicit_state
const int ANIMSTATE_DEAD2
const int ANIMACTION_PAIN1
float anim_lower_action
const int ANIMIMPLICITSTATE_RIGHT
const int ANIMSTATE_DUCK
vector anim_vec(Animation anim, int mdlidx, int numframes, float framerate)
Definition animdecide.qh:37
void animdecide_setaction(entity e, float action, float restart)
float anim_upper_implicit_time
const int ANIMACTION_SHOOT
const int ANIMIMPLICITSTATE_BACKWARDS
#define BIT(n)
Only ever assign into the first 24 bits in QC (so max is BIT(23)).
Definition bits.qh:8
#define BITS(n)
Definition bits.qh:9
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
ATTRIB(Animation, m_framenames, string)
LOG_DEBUGF("Missing animation for %s: %s", modelnameforindex(mdlidx), this.registered_id)
#define FOREACH_WORD(words, cond, body)
Definition iter.qh:33
entity anim
Definition menu.qh:25
#define CLASS(...)
Definition oo.qh:145
#define ENDCLASS(cname)
Definition oo.qh:281
#define STATIC_METHOD(cname, name, prototype)
Definition oo.qh:278
#define NULL
Definition post.qh:14
string registered_id
registered item identifier
Definition registry.qh:60
#define REGISTER_REGISTRY(id)
Definition registry.qh:229
#define REGISTRY(id, max)
Declare a new registry.
Definition registry.qh:26
#define REGISTRY_DEFINE_GET(id, null)
Definition registry.qh:40
vector
Definition self.qh:92
entity this
Definition self.qh:72