mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 01:58:19 +00:00
many smaller changes. changed how projectiles are handled. fixed joining bug
This commit is contained in:
parent
5702b3bfd0
commit
7efefe2716
Binary file not shown.
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 66 KiB |
|
@ -210,6 +210,10 @@ images {
|
|||
emoticons {
|
||||
filename "data/emoticons.png"
|
||||
}
|
||||
|
||||
browseicons {
|
||||
filename "data/browse_icons.png"
|
||||
}
|
||||
}
|
||||
|
||||
particles {
|
||||
|
@ -617,6 +621,13 @@ sprites {
|
|||
deadtee 2 3 1 1
|
||||
blank2 3 3 1 1
|
||||
}
|
||||
|
||||
browseicons images.browseicons 4 1 {
|
||||
browse_lock 0 0 1 1
|
||||
browse_progress1 1 0 1 1
|
||||
browse_progress2 2 0 1 1
|
||||
browse_progress3 3 0 1 1
|
||||
}
|
||||
}
|
||||
|
||||
animations {
|
||||
|
|
|
@ -555,8 +555,6 @@ static void client_process_packet(NETPACKET *packet)
|
|||
SERVER_INFO info = {0};
|
||||
int i;
|
||||
|
||||
dbg_msg("temp", "got server info");
|
||||
|
||||
unpacker_reset(&up, (unsigned char*)packet->data+sizeof(SERVERBROWSE_INFO), packet->data_size-sizeof(SERVERBROWSE_INFO));
|
||||
|
||||
strncpy(info.version, unpacker_get_string(&up), 32);
|
||||
|
@ -567,6 +565,9 @@ static void client_process_packet(NETPACKET *packet)
|
|||
info.progression = atol(unpacker_get_string(&up));
|
||||
info.num_players = atol(unpacker_get_string(&up));
|
||||
info.max_players = atol(unpacker_get_string(&up));
|
||||
sprintf(info.address, "%d.%d.%d.%d:%d",
|
||||
packet->address.ip[0], packet->address.ip[1], packet->address.ip[2],
|
||||
packet->address.ip[3], packet->address.port);
|
||||
|
||||
for(i = 0; i < info.num_players; i++)
|
||||
{
|
||||
|
|
|
@ -932,9 +932,17 @@ static void render_projectile(const obj_projectile *prev, const obj_projectile *
|
|||
gfx_texture_set(data->images[IMAGE_GAME].id);
|
||||
gfx_quads_begin();
|
||||
|
||||
// get positions
|
||||
float gravity = -400;
|
||||
float ct = (client_tick()-current->start_tick)/(float)SERVER_TICK_SPEED + client_intratick()*1/(float)SERVER_TICK_SPEED;
|
||||
vec2 startpos(current->x, current->y);
|
||||
vec2 startvel(current->vx, current->vy);
|
||||
vec2 pos = calc_pos(startpos, startvel, gravity, ct);
|
||||
vec2 prevpos = calc_pos(startpos, startvel, gravity, ct-0.001f);
|
||||
|
||||
select_sprite(data->weapons[current->type%data->num_weapons].sprite_proj);
|
||||
vec2 vel = mix(vec2(prev->vx, prev->vy), vec2(current->vx, current->vy), client_intratick());
|
||||
vec2 pos = mix(vec2(prev->x, prev->y), vec2(current->x, current->y), client_intratick());
|
||||
vec2 vel = pos-prevpos;
|
||||
//vec2 pos = mix(vec2(prev->x, prev->y), vec2(current->x, current->y), client_intratick());
|
||||
|
||||
// add particle for this projectile
|
||||
proj_particles.addparticle(current->type, itemid, pos, vel);
|
||||
|
|
|
@ -62,6 +62,7 @@ enum
|
|||
PAGE_FAVORITES,
|
||||
PAGE_SETTINGS,
|
||||
PAGE_GAME,
|
||||
PAGE_SYSTEM,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
|
@ -72,6 +73,8 @@ typedef struct
|
|||
static float scale = 1.0f;
|
||||
static RECT screen = { 0.0f, 0.0f, 800.0f, 600.0f };
|
||||
|
||||
extern void select_sprite(int id, int flags=0, int sx=0, int sy=0);
|
||||
|
||||
RECT *ui2_screen()
|
||||
{
|
||||
return &screen;
|
||||
|
@ -270,6 +273,27 @@ static void ui2_draw_rect(const RECT *r, vec4 color, int corners, float rounding
|
|||
gfx_quads_end();
|
||||
}
|
||||
|
||||
static void ui2_draw_browse_icon(const void *id, const char *text, int checked, const RECT *r, void *extra)
|
||||
{
|
||||
gfx_texture_set(data->images[IMAGE_BROWSEICONS].id);
|
||||
gfx_quads_begin();
|
||||
if(text[0] == 'L')
|
||||
select_sprite(SPRITE_BROWSE_LOCK);
|
||||
else
|
||||
{
|
||||
int i = atoi(text);
|
||||
if(i < 33)
|
||||
select_sprite(SPRITE_BROWSE_PROGRESS1);
|
||||
else if(i < 66)
|
||||
select_sprite(SPRITE_BROWSE_PROGRESS2);
|
||||
else
|
||||
select_sprite(SPRITE_BROWSE_PROGRESS3);
|
||||
}
|
||||
//draw_round_rect_ext(r->x,r->y,r->w,r->h,rounding*ui2_scale(), corners);
|
||||
gfx_quads_drawTL(r->x,r->y,r->w,r->h);
|
||||
gfx_quads_end();
|
||||
}
|
||||
|
||||
static void ui2_draw_menu_button(const void *id, const char *text, int checked, const RECT *r, void *extra)
|
||||
{
|
||||
ui2_draw_rect(r, vec4(1,1,1,0.5f), CORNER_ALL, 5.0f);
|
||||
|
@ -313,12 +337,16 @@ static void ui2_draw_grid_header(const void *id, const char *text, int checked,
|
|||
ui2_do_label(&t, text, 18, -1);
|
||||
}
|
||||
|
||||
static void ui2_draw_grid_cell(const void *id, const char *text, int checked, const RECT *r, void *extra)
|
||||
static void ui2_draw_grid_cell_l(const void *id, const char *text, int checked, const RECT *r, void *extra)
|
||||
{
|
||||
//ui2_draw_round_rect(r, 2.0f, vec4(1,1,1,1));
|
||||
ui2_do_label(r, text, 18, -1);
|
||||
}
|
||||
|
||||
static void ui2_draw_grid_cell_r(const void *id, const char *text, int checked, const RECT *r, void *extra)
|
||||
{
|
||||
ui2_do_label(r, text, 18, 1);
|
||||
}
|
||||
|
||||
static void ui2_draw_list_row(const void *id, const char *text, int checked, const RECT *r, void *extra)
|
||||
{
|
||||
if(checked)
|
||||
|
@ -610,6 +638,14 @@ static int menu2_render_menubar(RECT r)
|
|||
config.ui_page = PAGE_FAVORITES;
|
||||
}
|
||||
|
||||
/*
|
||||
ui2_vsplit_r(&box, 110.0f, &box, &button);
|
||||
static int system_button=0;
|
||||
if (ui2_do_button(&system_button, "System", config.ui_page==PAGE_SYSTEM, &button, ui2_draw_menu_tab_button, 0))
|
||||
config.ui_page = PAGE_SYSTEM;
|
||||
|
||||
ui2_vsplit_r(&box, 30.0f, &box, 0);
|
||||
*/
|
||||
ui2_vsplit_r(&box, 110.0f, &box, &button);
|
||||
static int settings_button=0;
|
||||
if (ui2_do_button(&settings_button, "Settings", config.ui_page==PAGE_SETTINGS, &button, ui2_draw_menu_tab_button, 0))
|
||||
|
@ -685,12 +721,13 @@ static void menu2_render_serverbrowser(RECT main_view)
|
|||
|
||||
static column cols[] = {
|
||||
{-1, -1, " ", -1, 10.0f, 0, {0}, {0}},
|
||||
{COL_FLAGS, -1, " ", -1, 15.0f, 0, {0}, {0}},
|
||||
{COL_FLAGS, -1, " ", -1, 20.0f, 0, {0}, {0}},
|
||||
{COL_NAME, BROWSESORT_NAME, "Name", 0, 300.0f, 0, {0}, {0}},
|
||||
{COL_GAMETYPE, BROWSESORT_GAMETYPE, "Type", 1, 50.0f, 0, {0}, {0}},
|
||||
{COL_MAP, BROWSESORT_MAP, "Map", 1, 100.0f, 0, {0}, {0}},
|
||||
{COL_PLAYERS, BROWSESORT_NUMPLAYERS, "Players", 1, 60.0f, 0, {0}, {0}},
|
||||
{COL_PROGRESS, BROWSESORT_PROGRESSION, "%", 1, 40.0f, FIXED, {0}, {0}},
|
||||
{-1, -1, " ", 1, 10.0f, 0, {0}, {0}},
|
||||
{COL_PROGRESS, BROWSESORT_PROGRESSION, "%", 1, 20.0f, FIXED, {0}, {0}},
|
||||
{COL_PING, BROWSESORT_PING, "Ping", 1, 40.0f, FIXED, {0}, {0}},
|
||||
};
|
||||
|
||||
|
@ -804,7 +841,6 @@ static void menu2_render_serverbrowser(RECT main_view)
|
|||
}
|
||||
|
||||
k += h*3/4;
|
||||
i += h*3/4;
|
||||
}
|
||||
else
|
||||
ui2_hsplit_t(&view, 20.0f, &row, &view);
|
||||
|
@ -824,26 +860,26 @@ static void menu2_render_serverbrowser(RECT main_view)
|
|||
if(id == COL_FLAGS)
|
||||
{
|
||||
if(item->flags&1)
|
||||
s = ui2_do_button(item, "P", l, &button, ui2_draw_grid_cell, 0);
|
||||
s = ui2_do_button(item, "L", l, &button, ui2_draw_browse_icon, 0);
|
||||
}
|
||||
else if(id == COL_NAME)
|
||||
s = ui2_do_button(item, item->name, l, &button, ui2_draw_grid_cell, 0);
|
||||
s = ui2_do_button(item, item->name, l, &button, ui2_draw_grid_cell_l, 0);
|
||||
else if(id == COL_MAP)
|
||||
s = ui2_do_button(item, item->map, l, &button, ui2_draw_grid_cell, 0);
|
||||
s = ui2_do_button(item, item->map, l, &button, ui2_draw_grid_cell_l, 0);
|
||||
else if(id == COL_PLAYERS)
|
||||
{
|
||||
sprintf(temp, "%i/%i", item->num_players, item->max_players);
|
||||
s = ui2_do_button(item, temp, l, &button, ui2_draw_grid_cell, 0);
|
||||
s = ui2_do_button(item, temp, l, &button, ui2_draw_grid_cell_r, 0);
|
||||
}
|
||||
else if(id == COL_PING)
|
||||
{
|
||||
sprintf(temp, "%i", item->latency);
|
||||
s = ui2_do_button(item, temp, l, &button, ui2_draw_grid_cell, 0);
|
||||
s = ui2_do_button(item, temp, l, &button, ui2_draw_grid_cell_r, 0);
|
||||
}
|
||||
else if(id == COL_PROGRESS)
|
||||
{
|
||||
sprintf(temp, "%i", item->progression);
|
||||
s = ui2_do_button(item, temp, l, &button, ui2_draw_grid_cell, 0);
|
||||
s = ui2_do_button(item, temp, l, &button, ui2_draw_browse_icon, 0);
|
||||
}
|
||||
else if(id == COL_GAMETYPE)
|
||||
{
|
||||
|
@ -851,12 +887,13 @@ static void menu2_render_serverbrowser(RECT main_view)
|
|||
if(item->game_type == GAMETYPE_DM) type = "DM";
|
||||
else if(item->game_type == GAMETYPE_TDM) type = "TDM";
|
||||
else if(item->game_type == GAMETYPE_CTF) type = "CTF";
|
||||
s = ui2_do_button(item, type, l, &button, ui2_draw_grid_cell, 0);
|
||||
s = ui2_do_button(item, type, l, &button, ui2_draw_grid_cell_l, 0);
|
||||
}
|
||||
|
||||
if(s)
|
||||
{
|
||||
new_selected = item_index;
|
||||
dbg_msg("dbg", "addr = %s", item->address);
|
||||
strncpy(config.ui_server_address, item->address, sizeof(config.ui_server_address));
|
||||
}
|
||||
}
|
||||
|
@ -1216,6 +1253,9 @@ int menu2_render()
|
|||
ui2_vmargin(&tab_bar, 20.0f, &tab_bar);
|
||||
menu2_render_menubar(tab_bar);
|
||||
|
||||
// do bottom bar
|
||||
//ui2_hsplit_b(&main_view, 26.0f, &main_view, &bottom_bar);
|
||||
|
||||
// render current page
|
||||
if(config.ui_page == PAGE_GAME)
|
||||
menu2_render_game(main_view);
|
||||
|
@ -1232,3 +1272,5 @@ int menu2_render()
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -26,6 +26,15 @@ inline float get_angle(vec2 dir)
|
|||
}
|
||||
|
||||
|
||||
inline vec2 calc_pos(vec2 p, vec2 v, float gravity, float t)
|
||||
{
|
||||
vec2 n;
|
||||
n.x = p.x + v.x*t;
|
||||
n.y = p.y + v.y*t - gravity*(t*t);
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
template<typename T>
|
||||
inline T saturated_add(T min, T max, T current, T modifier)
|
||||
{
|
||||
|
|
|
@ -143,8 +143,10 @@ struct obj_game
|
|||
struct obj_projectile
|
||||
{
|
||||
int type;
|
||||
int tick;
|
||||
int x, y;
|
||||
int vx, vy; // should be an angle instead
|
||||
int start_tick;
|
||||
};
|
||||
|
||||
struct obj_powerup
|
||||
|
|
|
@ -270,7 +270,7 @@ projectile::projectile(int type, int owner, vec2 pos, vec2 vel, int span, entity
|
|||
{
|
||||
this->type = type;
|
||||
this->pos = pos;
|
||||
this->vel = vel;
|
||||
this->vel = vel * SERVER_TICK_SPEED; // TODO: remove this
|
||||
this->lifespan = span;
|
||||
this->owner = owner;
|
||||
this->powner = powner;
|
||||
|
@ -280,6 +280,7 @@ projectile::projectile(int type, int owner, vec2 pos, vec2 vel, int span, entity
|
|||
this->sound_impact = sound_impact;
|
||||
this->weapon = weapon;
|
||||
this->bounce = 0;
|
||||
this->start_tick = server_tick();
|
||||
world->insert_entity(this);
|
||||
}
|
||||
|
||||
|
@ -290,36 +291,26 @@ void projectile::reset()
|
|||
|
||||
void projectile::tick()
|
||||
{
|
||||
vec2 oldpos = pos;
|
||||
|
||||
int collide = 0;
|
||||
if(bounce)
|
||||
{
|
||||
int numbounces;
|
||||
vel.y += 0.25f;
|
||||
move_point(&pos, &vel, 0.25f, &numbounces);
|
||||
bounce -= numbounces;
|
||||
}
|
||||
else
|
||||
{
|
||||
vel.y += 0.25f;
|
||||
pos += vel;
|
||||
collide = col_check_point((int)pos.x, (int)pos.y);
|
||||
}
|
||||
float gravity = -400;
|
||||
float pt = (server_tick()-start_tick-1)/(float)SERVER_TICK_SPEED;
|
||||
float ct = (server_tick()-start_tick)/(float)SERVER_TICK_SPEED;
|
||||
vec2 prevpos = calc_pos(pos, vel, gravity, pt);
|
||||
vec2 curpos = calc_pos(pos, vel, gravity, ct);
|
||||
|
||||
lifespan--;
|
||||
|
||||
// check player intersection as well
|
||||
vec2 new_pos;
|
||||
entity *targetplayer = (entity*)intersect_player(oldpos, pos, new_pos, powner);
|
||||
int collide = col_check_point((int)curpos.x, (int)curpos.y);
|
||||
|
||||
if(targetplayer || lifespan < 0 || collide || bounce < 0)
|
||||
vec2 new_pos;
|
||||
entity *targetplayer = (entity*)intersect_player(prevpos, curpos, new_pos, powner);
|
||||
|
||||
if(targetplayer || collide || lifespan < 0 )
|
||||
{
|
||||
if (lifespan >= 0 || weapon == WEAPON_ROCKET)
|
||||
create_sound(pos, sound_impact);
|
||||
|
||||
if (flags & PROJECTILE_FLAGS_EXPLODE)
|
||||
create_explosion(oldpos, owner, weapon, false);
|
||||
create_explosion(prevpos, owner, weapon, false);
|
||||
else if (targetplayer)
|
||||
{
|
||||
targetplayer->take_damage(normalize(vel) * max(0.001f, force), damage, owner, weapon);
|
||||
|
@ -331,14 +322,18 @@ void projectile::tick()
|
|||
|
||||
void projectile::snap(int snapping_client)
|
||||
{
|
||||
if(distance(players[snapping_client].pos, pos) > 1000.0f)
|
||||
float ct = (server_tick()-start_tick)/(float)SERVER_TICK_SPEED;
|
||||
vec2 curpos = calc_pos(pos, vel, -7.5f*SERVER_TICK_SPEED, ct);
|
||||
|
||||
if(distance(players[snapping_client].pos, curpos) > 1000.0f)
|
||||
return;
|
||||
|
||||
obj_projectile *proj = (obj_projectile *)snap_new_item(OBJTYPE_PROJECTILE, id, sizeof(obj_projectile));
|
||||
proj->x = (int)pos.x;
|
||||
proj->y = (int)pos.y;
|
||||
proj->vx = (int)vel.x; // TODO: should be an angle
|
||||
proj->vx = (int)vel.x;
|
||||
proj->vy = (int)vel.y;
|
||||
proj->start_tick = start_tick;
|
||||
proj->type = type;
|
||||
}
|
||||
|
||||
|
|
|
@ -186,6 +186,7 @@ public:
|
|||
int weapon;
|
||||
int bounce;
|
||||
float force;
|
||||
int start_tick;
|
||||
|
||||
projectile(int type, int owner, vec2 pos, vec2 vel, int span, entity* powner,
|
||||
int damage, int flags, float force, int sound_impact, int weapon);
|
||||
|
|
Loading…
Reference in a new issue