fteqw/quakec/csqctest/src/cs/q4player.qc

217 lines
4.8 KiB
Plaintext

enum
{
ANIM_FORWARD,
ANIM_BACK,
ANIM_LEFT,
ANIM_RIGHT,
ANIM_IDLE,
ANIM_MAX
};
float anim[ANIM_MAX];
.vector lastorg;
.float aweight[ANIM_MAX];
.float atime[ANIM_MAX];
.float rangle;
/*pick an angle for the legs to run in such that the movement is in 0, 90, 180, -90 angles from movement direction. attempt to clamp past a full circle*/
float() anglequadrant =
{
float ideal, diff;
if (!self.velocity_x && !self.velocity_y)
ideal = self.angles_y;
else
ideal = vectoyaw(self.velocity);
diff = ideal - self.angles_y;
if (diff > 180)
diff -= 360;
if (diff < -180)
diff += 360;
if (diff < -180)
return self.angles_y + 180;
else if (diff > 180)
return self.angles_y - 180;
else if (diff < -150)
return ideal + 180;
else if (diff > 150)
return ideal - 180;
else if (diff > 75)
return ideal - 90;
else if (diff < -75)
return ideal + 90;
else
return ideal;
};
void(float ideal, float speed) mychangeyaw =
{
float move;
move = ideal - self.angles_y;
speed *= frametime;
if (move > 180)
move -= 360;
if (move < -180)
move += 360;
if (move >= 0)
{
if (move > speed)
move = speed;
}
else
{
if (move < -speed)
move = -speed;
}
self.angles_y = self.angles_y + move;
};
void() Q4PM_Draw =
{
float fw, rt;
float tweight;
float i;
float ideal;
vector aimang;
vector move = self.origin - self.lastorg;
self.lastorg = self.origin;
if (!self.skeletonindex)
{
self.skeletonindex = skel_create(self.modelindex, FALSE);
if (!self.skeletonindex)
return;
}
ideal = anglequadrant();
aimang_y = self.angles_y;
aimang_z = self.angles_x*-3;
self.angles_x = 0;
self.angles_y = self.rangle;
self.angles_z = 0;
mychangeyaw(ideal, 360);
self.rangle = self.angles_y;
makevectors(self.angles);
fw = (move * v_forward)/(320);
rt = (move * v_right)/(320);
aimang_y -= self.angles_y;
aimang_x = 0;
if (aimang_y > 180)
aimang_y -= 360;
if (aimang_y < -180)
aimang_y += 360;
makevectors(aimang*0.333);
if (fw*fw > 0)
{
if (fw > 0)
self.aweight[ANIM_FORWARD] += fw*32;
else
self.aweight[ANIM_BACK] -= fw*32;
}
if (fw > 0)
self.atime[ANIM_FORWARD] += fw;
else
self.atime[ANIM_BACK] -= fw;
if (rt*rt > 0)
{
if (rt > 0)
self.aweight[ANIM_RIGHT] += rt*32;
else
self.aweight[ANIM_LEFT] -= rt*32;
}
if (rt > 0)
self.atime[ANIM_RIGHT] += rt;
else
self.atime[ANIM_LEFT] -= rt;
if (move_x == 0 && move_y == 0)
self.aweight[ANIM_IDLE] += frametime*4;
self.atime[ANIM_IDLE] += frametime;
tweight = self.aweight[ANIM_FORWARD]+self.aweight[ANIM_BACK]+self.aweight[ANIM_LEFT]+self.aweight[ANIM_RIGHT]+self.aweight[ANIM_IDLE];
if (tweight > 1)
{
tweight = 1/tweight;
self.aweight[ANIM_FORWARD] *= tweight;
self.aweight[ANIM_BACK] *= tweight;
self.aweight[ANIM_LEFT] *= tweight;
self.aweight[ANIM_RIGHT] *= tweight;
self.aweight[ANIM_IDLE] *= tweight;
}
else
{
self.aweight[ANIM_IDLE] += 1-tweight;
self.atime[ANIM_IDLE] += frametime;
}
self.origin_z -= 24;//self.mins_z;
setmodel(self, self.model);
for (i = 0; i < ANIM_MAX; i++)
{
self.frame = 0;
self.frame2 = 0;
self.lerpfrac = 0;
self.frame1time = self.atime[i];
self.frame2time = self.atime[i];
skel_build(self.skeletonindex, self, anim[i], ((i==0)?0:1), 0, -1, self.aweight[i]);
}
skel_premul_bone(self.skeletonindex, 18, '0 0 0', v_forward, v_right, v_up);
skel_premul_bone(self.skeletonindex, 19, '0 0 0', v_forward, v_right, v_up);
skel_premul_bone(self.skeletonindex, 20, '0 0 0', v_forward, v_right, v_up);
//obliterate the bone movement, so that it doesn't move forwards.
skel_get_bonerel(self.skeletonindex, 1);
skel_set_bone(self.skeletonindex, 1, '0 0 0', v_forward*(64/72), v_right*(64/72), v_up*(64/72));
self.renderflags = 0;
addentity(self);
self.origin = self.lastorg;
};
float(string skinname) Q4PM_SetModel =
{
string mname = strcat("models/characters/player/", skinname, ".md5mesh");
//check to see if it exists
if not (whichpack(mname))
{
print(sprintf("File %s doesn't exist\n", mname));
return false;
}
anim[ANIM_IDLE] = getmodelindex("models/characters/player/idle.md5anim");
anim[ANIM_FORWARD] = getmodelindex("models/characters/player/run.md5anim");
anim[ANIM_BACK] = getmodelindex("models/characters/player/run_backwards.md5anim");
anim[ANIM_RIGHT] = getmodelindex("models/characters/player/strafe_right.md5anim");
anim[ANIM_LEFT] = getmodelindex("models/characters/player/strafe_left.md5anim");
setmodel(self, mname);
self.rangle = self.angles_y;
return true;
};
void() Q4PM_UnsetModel =
{
if (self.skeletonindex)
skel_delete(self.skeletonindex);
self.skeletonindex = 0;
};
entity() Q4PM_DupModel
{
return spawn();
};