print(" time ------------------------------> f : seconds since VM start\n");
print(" s /MD4 digest ---------------------> s : MD4 digest\n");
print(" s /SHA256 digest ------------------> s : SHA256 digest\n");
+ print(" s /formatstring sprintf1s ---------> s : sprintf with 1 string (pad, cut)\n");
print(" Set operations operate on 'such''strings'.\n");
print(" Unknown tokens insert their cvar value.\n");
print(" maplist add map\n");
} else if(rpncmd == "digest") {
s = rpn_pop();
rpn_set(digest_hex(s, rpn_get()));
+ } else if(rpncmd == "sprintf1s") {
+ s = rpn_pop();
+ rpn_set(sprintf(s, rpn_get()));
} else {
rpn_push(cvar_string(rpncmd));
}
tokens = tokenizebyseparator(parms, " ");
- if(tokens==2)
+ if(tokens<2||tokens>3)
+ return CMD_STATUS_ERROR;
+
+ step = (tokens == 3) ? stof(argv(2)) : 0;
+
+ if(step == 0)
{
self.v_angle_x -= stof(argv(1));
self.v_angle_y += stof(argv(0));
return CMD_STATUS_FINISHED;
}
- if(tokens<2||tokens>3)
- return CMD_STATUS_ERROR;
-
- step = stof(argv(2));
-
self.bot_cmd_aim_begin = self.v_angle;
self.bot_cmd_aim_end_x = self.v_angle_x - stof(argv(1));
self.anim_forwardleft = animfixfps(self, '20 1 1');
self.anim_backright = animfixfps(self, '21 1 1');
self.anim_backleft = animfixfps(self, '22 1 1');
- self.anim_melee = animfixfps(self, '23 1 1');
- self.anim_duckwalkbackwards = animfixfps(self, '24 1 1');
+ self.anim_melee = animfixfps2(self, '23 1 1', '11 1 5');
+ self.anim_duckwalkbackwards = animfixfps2(self, '24 1 1', '4 1 1');
+ self.anim_duckwalkstrafeleft = animfixfps2(self, '25 1 1', '4 1 1');
+ self.anim_duckwalkstraferight = animfixfps2(self, '26 1 1', '4 1 1');
+ self.anim_duckwalkforwardright = animfixfps2(self, '27 1 1', '4 1 1');
+ self.anim_duckwalkforwardleft = animfixfps2(self, '28 1 1', '4 1 1');
+ self.anim_duckwalkbackright = animfixfps2(self, '29 1 1', '4 1 1');
+ self.anim_duckwalkbackleft = animfixfps2(self, '30 1 1', '4 1 1');
// TODO introspect models for finding right "fps" value (1/duration)
// reset animstate now
setanim(self, self.anim_idle, TRUE, FALSE, TRUE);
}
else if (self.crouch)
{
- if (self.movement_x < 0)
- setanim(self, self.anim_duckwalkbackwards, TRUE, FALSE, FALSE);
- else if (self.movement_x * self.movement_x + self.movement_y * self.movement_y > 20)
+ if (self.movement_x > 0 && self.movement_y == 0)
setanim(self, self.anim_duckwalk, TRUE, FALSE, FALSE);
+ else if (self.movement_x < 0 && self.movement_y == 0)
+ setanim(self, self.anim_duckwalkbackwards, TRUE, FALSE, FALSE);
+ else if (self.movement_x == 0 && self.movement_y > 0)
+ setanim(self, self.anim_duckwalkstraferight, TRUE, FALSE, FALSE);
+ else if (self.movement_x == 0 && self.movement_y < 0)
+ setanim(self, self.anim_duckwalkstrafeleft, TRUE, FALSE, FALSE);
+ else if (self.movement_x > 0 && self.movement_y > 0)
+ setanim(self, self.anim_duckwalkforwardright, TRUE, FALSE, FALSE);
+ else if (self.movement_x > 0 && self.movement_y < 0)
+ setanim(self, self.anim_duckwalkforwardleft, TRUE, FALSE, FALSE);
+ else if (self.movement_x < 0 && self.movement_y > 0)
+ setanim(self, self.anim_duckwalkbackright, TRUE, FALSE, FALSE);
+ else if (self.movement_x < 0 && self.movement_y < 0)
+ setanim(self, self.anim_duckwalkbackleft, TRUE, FALSE, FALSE);
else
setanim(self, self.anim_duckidle, TRUE, FALSE, FALSE);
}
}
}
+void ClientCommand_selfstuff(float request, string command)
+{
+ switch(request)
+ {
+ case CC_REQUEST_COMMAND:
+ {
+ stuffcmd(self, substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1)));
+ return; // never fall through to usage
+ }
+
+ default:
+ case CC_REQUEST_USAGE:
+ {
+ sprint(self, "\nUsage:^3 cmd selfstuff command\n");
+ sprint(self, " Where 'command' is the string to be stuffed to your client.\n");
+ return;
+ }
+ }
+}
+
void ClientCommand_sentcvar(float request, float argc, string command)
{
switch(request)
CLIENT_COMMAND("say", ClientCommand_say(request, arguments, command), "Print a message to chat to all players") \
CLIENT_COMMAND("say_team", ClientCommand_say_team(request, arguments, command), "Print a message to chat to all team mates") \
CLIENT_COMMAND("selectteam", ClientCommand_selectteam(request, arguments), "Attempt to choose a team to join into") \
+ CLIENT_COMMAND("selfstuff", ClientCommand_selfstuff(request, command), "Stuffcmd a command to your own client") \
CLIENT_COMMAND("sentcvar", ClientCommand_sentcvar(request, arguments, command), "New system for sending a client cvar to the server") \
CLIENT_COMMAND("spectate", ClientCommand_spectate(request), "Become an observer") \
CLIENT_COMMAND("suggestmap", ClientCommand_suggestmap(request, arguments), "Suggest a map to the mapvote at match end") \
.vector anim_draw; // player pulls out a weapon
// .vector anim_duck; // player crouches (from idle to duckidle)
.vector anim_duckwalk; // player walking while crouching
-.vector anim_duckwalkbackwards; // player walking while crouching
.vector anim_duckjump; // player jumping from a crouch
.vector anim_duckidle; // player idling while crouching
.vector anim_idle; // player standing
.vector anim_backright; // player running backward and right
.vector anim_backleft; // player running back and left
.vector anim_melee; // player doing the melee action
+.vector anim_duck; // player doing the melee action
+.vector anim_duckwalkbackwards;
+.vector anim_duckwalkstrafeleft;
+.vector anim_duckwalkstraferight;
+.vector anim_duckwalkforwardright;
+.vector anim_duckwalkforwardleft;
+.vector anim_duckwalkbackright;
+.vector anim_duckwalkbackleft;
// weapon animation vectors:
.vector anim_fire1;
return a;
}
+vector animfixfps2(entity e, vector a, vector b)
+{
+ // multi-frame anim: keep as-is
+ float dur;
+ dur = frameduration(e.modelindex, a_x);
+ if(dur <= 0)
+ {
+ a = b;
+ dur = frameduration(e.modelindex, a_x);
+ }
+ if(a_y == 1)
+ {
+ if(dur > 0)
+ a_z = 1.0 / dur;
+ }
+ return a;
+}
+
/*
==================
SUB_Remove