mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-20 09:34:19 +00:00
console now has proper backlog and command history. kill command added. predicted hooks no longer make a sound when hitting a player.
This commit is contained in:
parent
be33e56abc
commit
d76661b3be
|
@ -208,7 +208,9 @@ void *ringbuf_item_ptr(void *p)
|
|||
|
||||
void *ringbuf_first(RINGBUFFER *rb)
|
||||
{
|
||||
return ringbuf_next(rb, rb->last_alloc+1);
|
||||
if(rb->last_alloc && rb->last_alloc->next)
|
||||
return ringbuf_next(rb, rb->last_alloc->next+1);
|
||||
return 0x0;
|
||||
}
|
||||
|
||||
void *ringbuf_last(RINGBUFFER *rb)
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
#ifndef _RINGBUFFER_H
|
||||
#define _RINGBUFFER_H
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -20,3 +22,5 @@ void *ringbuf_prev(RINGBUFFER *rb, void *current);
|
|||
void *ringbuf_next(RINGBUFFER *rb, void *current);
|
||||
void *ringbuf_first(RINGBUFFER *rb);
|
||||
void *ringbuf_last(RINGBUFFER *rb);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -334,6 +334,14 @@ void send_emoticon(int emoticon)
|
|||
client_send_msg();
|
||||
}
|
||||
|
||||
void send_kill(int client_id)
|
||||
{
|
||||
msg_pack_start(MSG_KILL, MSGFLAG_VITAL);
|
||||
msg_pack_int(client_id);
|
||||
msg_pack_end();
|
||||
client_send_msg();
|
||||
}
|
||||
|
||||
void anim_seq_eval(sequence *seq, float time, keyframe *frame)
|
||||
{
|
||||
if(seq->num_frames == 0)
|
||||
|
|
|
@ -5,6 +5,7 @@ extern "C" {
|
|||
#include <engine/e_client_interface.h>
|
||||
#include <engine/e_config.h>
|
||||
#include <engine/e_console.h>
|
||||
#include <engine/e_ringbuffer.h>
|
||||
#include <engine/client/ec_font.h>
|
||||
}
|
||||
|
||||
|
@ -24,23 +25,24 @@ enum
|
|||
CONSOLE_CLOSING,
|
||||
};
|
||||
|
||||
static char console_history_data[65536];
|
||||
static RINGBUFFER *console_history;
|
||||
|
||||
static char console_backlog_data[65536];
|
||||
static RINGBUFFER *console_backlog;
|
||||
|
||||
static unsigned int console_input_len = 0;
|
||||
static char console_input[256] = {0};
|
||||
static int console_state = CONSOLE_CLOSED;
|
||||
static float state_change_end = 0.0f;
|
||||
static const float state_change_duration = 0.1f;
|
||||
|
||||
static char backlog[256][256] = {{0}};
|
||||
static int backlog_len;
|
||||
|
||||
static float time_now()
|
||||
{
|
||||
static long long time_start = time_get();
|
||||
return float(time_get()-time_start)/float(time_freq());
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void client_console_print(const char *str)
|
||||
{
|
||||
int len = strlen(str);
|
||||
|
@ -48,24 +50,8 @@ static void client_console_print(const char *str)
|
|||
if (len > 255)
|
||||
len = 255;
|
||||
|
||||
if (backlog_len >= 256)
|
||||
{
|
||||
static int warning = 0;
|
||||
if (!warning)
|
||||
{
|
||||
puts("console backlog full");
|
||||
warning = 1;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(backlog[backlog_len], str, len);
|
||||
backlog[backlog_len][len] = 0;
|
||||
|
||||
backlog_len++;
|
||||
|
||||
//dbg_msg("console", "FROM CLIENT!! %s", str);
|
||||
char *entry = (char *)ringbuf_allocate(console_backlog, len+1);
|
||||
memcpy(entry, str, len+1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -76,12 +62,37 @@ static void con_team(void *result, void *user_data)
|
|||
send_switch_team(new_team);
|
||||
}
|
||||
|
||||
void client_console_init()
|
||||
static void command_history(void *result, void *user_data)
|
||||
{
|
||||
console_register_print_callback(client_console_print);
|
||||
MACRO_REGISTER_COMMAND("team", "i", con_team, 0x0);
|
||||
char *entry = (char *)ringbuf_first(console_history);
|
||||
|
||||
while (entry)
|
||||
{
|
||||
dbg_msg("console/history", entry);
|
||||
|
||||
entry = (char *)ringbuf_next(console_history, entry);
|
||||
}
|
||||
}
|
||||
|
||||
void send_kill(int client_id);
|
||||
|
||||
static void command_kill(void *result, void *user_data)
|
||||
{
|
||||
send_kill(-1);
|
||||
}
|
||||
|
||||
void client_console_init()
|
||||
{
|
||||
console_history = ringbuf_init(console_history_data, sizeof(console_history_data));
|
||||
console_backlog = ringbuf_init(console_backlog_data, sizeof(console_backlog_data));
|
||||
|
||||
console_register_print_callback(client_console_print);
|
||||
MACRO_REGISTER_COMMAND("team", "i", con_team, 0x0);
|
||||
MACRO_REGISTER_COMMAND("history", "", command_history, 0x0);
|
||||
MACRO_REGISTER_COMMAND("kill", "", command_kill, 0x0);
|
||||
}
|
||||
|
||||
static char *console_history_entry = 0x0;
|
||||
|
||||
void console_handle_input()
|
||||
{
|
||||
|
@ -105,6 +116,8 @@ void console_handle_input()
|
|||
console_input[console_input_len] = e.ch;
|
||||
console_input[console_input_len+1] = 0;
|
||||
console_input_len++;
|
||||
|
||||
console_history_entry = 0x0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -114,15 +127,67 @@ void console_handle_input()
|
|||
{
|
||||
console_input[console_input_len-1] = 0;
|
||||
console_input_len--;
|
||||
|
||||
console_history_entry = 0x0;
|
||||
}
|
||||
}
|
||||
else if(e.key == KEY_ENTER || e.key == KEY_KP_ENTER)
|
||||
{
|
||||
if (console_input_len)
|
||||
{
|
||||
char *entry = (char *)ringbuf_allocate(console_history, console_input_len+1);
|
||||
memcpy(entry, console_input, console_input_len+1);
|
||||
|
||||
console_execute(console_input);
|
||||
console_input[0] = 0;
|
||||
console_input_len = 0;
|
||||
|
||||
console_history_entry = 0x0;
|
||||
}
|
||||
}
|
||||
else if (e.key == KEY_UP)
|
||||
{
|
||||
if (console_history_entry)
|
||||
{
|
||||
char *test = (char *)ringbuf_prev(console_history, console_history_entry);
|
||||
|
||||
if (test)
|
||||
console_history_entry = test;
|
||||
}
|
||||
else
|
||||
console_history_entry = (char *)ringbuf_last(console_history);
|
||||
|
||||
if (console_history_entry)
|
||||
{
|
||||
unsigned int len = strlen(console_history_entry);
|
||||
if (len < sizeof(console_input) - 1)
|
||||
{
|
||||
memcpy(console_input, console_history_entry, len+1);
|
||||
|
||||
console_input_len = len;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else if (e.key == KEY_DOWN)
|
||||
{
|
||||
if (console_history_entry)
|
||||
console_history_entry = (char *)ringbuf_next(console_history, console_history_entry);
|
||||
|
||||
if (console_history_entry)
|
||||
{
|
||||
unsigned int len = strlen(console_history_entry);
|
||||
if (len < sizeof(console_input) - 1)
|
||||
{
|
||||
memcpy(console_input, console_history_entry, len+1);
|
||||
|
||||
console_input_len = len;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
console_input[0] = 0;
|
||||
console_input_len = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -208,7 +273,6 @@ void console_render()
|
|||
float row_height = font_size*1.4f;
|
||||
float width = gfx_text_width(0, font_size, console_input, -1);
|
||||
float x = 3, y = console_height - row_height - 2;
|
||||
int backlog_index = backlog_len-1;
|
||||
float prompt_width = gfx_text_width(0, font_size, ">", -1)+2;
|
||||
|
||||
gfx_text(0, x, y, font_size, ">", -1);
|
||||
|
@ -222,13 +286,13 @@ void console_render()
|
|||
|
||||
y -= row_height;
|
||||
|
||||
while (y > 0.0f && backlog_index >= 0)
|
||||
char *entry = (char *)ringbuf_last(console_backlog);
|
||||
while (y > 0.0f && entry)
|
||||
{
|
||||
const char *line = backlog[backlog_index];
|
||||
gfx_text(0, x, y, font_size, line, -1);
|
||||
|
||||
backlog_index--;
|
||||
gfx_text(0, x, y, font_size, entry, -1);
|
||||
y -= row_height;
|
||||
|
||||
entry = (char *)ringbuf_prev(console_backlog, entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -186,7 +186,7 @@ extern "C" void modc_predict()
|
|||
snd_play_random(CHN_WORLD, SOUND_PLAYER_AIRJUMP, 1.0f, pos);
|
||||
}
|
||||
//if(events&COREEVENT_HOOK_LAUNCH) snd_play_random(CHN_WORLD, SOUND_HOOK_LOOP, 1.0f, pos);
|
||||
if(events&COREEVENT_HOOK_ATTACH_PLAYER) snd_play_random(CHN_WORLD, SOUND_HOOK_ATTACH_PLAYER, 1.0f, pos);
|
||||
//if(events&COREEVENT_HOOK_ATTACH_PLAYER) snd_play_random(CHN_WORLD, SOUND_HOOK_ATTACH_PLAYER, 1.0f, pos);
|
||||
if(events&COREEVENT_HOOK_ATTACH_GROUND) snd_play_random(CHN_WORLD, SOUND_HOOK_ATTACH_GROUND, 1.0f, pos);
|
||||
//if(events&COREEVENT_HOOK_RETRACT) snd_play_random(CHN_WORLD, SOUND_PLAYER_JUMP, 1.0f, pos);
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@ enum
|
|||
MSG_WEAPON_PICKUP,
|
||||
MSG_SOUND_GLOBAL,
|
||||
MSG_TUNE_PARAMS,
|
||||
MSG_KILL,
|
||||
};
|
||||
|
||||
enum
|
||||
|
|
|
@ -1320,6 +1320,9 @@ void player::tick_defered()
|
|||
|
||||
void player::die(int killer, int weapon)
|
||||
{
|
||||
if (dead || team == -1)
|
||||
return;
|
||||
|
||||
int mode_special = gameobj->on_player_death(this, get_player(killer), weapon);
|
||||
|
||||
dbg_msg("game", "kill killer='%d:%s' victim='%d:%s' weapon=%d special=%d",
|
||||
|
@ -2067,6 +2070,13 @@ void mods_message(int msg, int client_id)
|
|||
int emoteicon = msg_unpack_int();
|
||||
send_emoticon(client_id, emoteicon % 16);
|
||||
}
|
||||
else if (msg == MSG_KILL)
|
||||
{
|
||||
//int kill_client_id = msg_unpack_int(); // to be used to kill players from rcon? hihi
|
||||
|
||||
player *pplayer = get_player(client_id);
|
||||
pplayer->die(client_id, -1);
|
||||
}
|
||||
}
|
||||
|
||||
extern unsigned char internal_data[];
|
||||
|
|
Loading…
Reference in a new issue