Skip to content

Commit d76b8c6

Browse files
sapiersapier
sapier
authored and
sapier
committedMay 31, 2014
Small cleanup of hud add/remove code
1 parent 5bd2aea commit d76b8c6

File tree

6 files changed

+98
-73
lines changed

6 files changed

+98
-73
lines changed
 

Diff for: ‎src/game.cpp

+31-44
Original file line numberDiff line numberDiff line change
@@ -2333,16 +2333,13 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
23332333

23342334
{
23352335
// Read client events
2336-
for(;;)
2337-
{
2336+
for(;;) {
23382337
ClientEvent event = client.getClientEvent();
2339-
if(event.type == CE_NONE)
2340-
{
2338+
if(event.type == CE_NONE) {
23412339
break;
23422340
}
23432341
else if(event.type == CE_PLAYER_DAMAGE &&
2344-
client.getHP() != 0)
2345-
{
2342+
client.getHP() != 0) {
23462343
//u16 damage = event.player_damage.amount;
23472344
//infostream<<"Player damage: "<<damage<<std::endl;
23482345

@@ -2356,13 +2353,11 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
23562353
MtEvent *e = new SimpleTriggerEvent("PlayerDamage");
23572354
gamedef->event()->put(e);
23582355
}
2359-
else if(event.type == CE_PLAYER_FORCE_MOVE)
2360-
{
2356+
else if(event.type == CE_PLAYER_FORCE_MOVE) {
23612357
camera_yaw = event.player_force_move.yaw;
23622358
camera_pitch = event.player_force_move.pitch;
23632359
}
2364-
else if(event.type == CE_DEATHSCREEN)
2365-
{
2360+
else if(event.type == CE_DEATHSCREEN) {
23662361
show_deathscreen(&current_formspec, &client, gamedef, tsrc,
23672362
device, &client);
23682363

@@ -2376,8 +2371,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
23762371
player->hurt_tilt_strength = 0;
23772372

23782373
}
2379-
else if (event.type == CE_SHOW_FORMSPEC)
2380-
{
2374+
else if (event.type == CE_SHOW_FORMSPEC) {
23812375
FormspecFormSource* fs_src =
23822376
new FormspecFormSource(*(event.show_formspec.formspec));
23832377
TextDestPlayerInventory* txt_dst =
@@ -2389,8 +2383,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
23892383
delete(event.show_formspec.formspec);
23902384
delete(event.show_formspec.formname);
23912385
}
2392-
else if(event.type == CE_SPAWN_PARTICLE)
2393-
{
2386+
else if(event.type == CE_SPAWN_PARTICLE) {
23942387
LocalPlayer* player = client.getEnv().getLocalPlayer();
23952388
video::ITexture *texture =
23962389
gamedef->tsrc()->getTexture(*(event.spawn_particle.texture));
@@ -2407,8 +2400,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
24072400
v2f(0.0, 0.0),
24082401
v2f(1.0, 1.0));
24092402
}
2410-
else if(event.type == CE_ADD_PARTICLESPAWNER)
2411-
{
2403+
else if(event.type == CE_ADD_PARTICLESPAWNER) {
24122404
LocalPlayer* player = client.getEnv().getLocalPlayer();
24132405
video::ITexture *texture =
24142406
gamedef->tsrc()->getTexture(*(event.add_particlespawner.texture));
@@ -2431,15 +2423,15 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
24312423
texture,
24322424
event.add_particlespawner.id);
24332425
}
2434-
else if(event.type == CE_DELETE_PARTICLESPAWNER)
2435-
{
2426+
else if(event.type == CE_DELETE_PARTICLESPAWNER) {
24362427
delete_particlespawner (event.delete_particlespawner.id);
24372428
}
2438-
else if (event.type == CE_HUDADD)
2439-
{
2429+
else if (event.type == CE_HUDADD) {
24402430
u32 id = event.hudadd.id;
2441-
size_t nhudelem = player->hud.size();
2442-
if (id > nhudelem || (id < nhudelem && player->hud[id])) {
2431+
2432+
HudElement *e = player->getHud(id);
2433+
2434+
if (e != NULL) {
24432435
delete event.hudadd.pos;
24442436
delete event.hudadd.name;
24452437
delete event.hudadd.scale;
@@ -2451,7 +2443,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
24512443
continue;
24522444
}
24532445

2454-
HudElement *e = new HudElement;
2446+
e = new HudElement;
24552447
e->type = (HudElementType)event.hudadd.type;
24562448
e->pos = *event.hudadd.pos;
24572449
e->name = *event.hudadd.name;
@@ -2465,10 +2457,9 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
24652457
e->world_pos = *event.hudadd.world_pos;
24662458
e->size = *event.hudadd.size;
24672459

2468-
if (id == nhudelem)
2469-
player->hud.push_back(e);
2470-
else
2471-
player->hud[id] = e;
2460+
u32 new_id = player->addHud(e);
2461+
//if this isn't true our huds aren't consistent
2462+
assert(new_id == id);
24722463

24732464
delete event.hudadd.pos;
24742465
delete event.hudadd.name;
@@ -2479,26 +2470,24 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
24792470
delete event.hudadd.world_pos;
24802471
delete event.hudadd.size;
24812472
}
2482-
else if (event.type == CE_HUDRM)
2483-
{
2484-
u32 id = event.hudrm.id;
2485-
if (id < player->hud.size() && player->hud[id]) {
2486-
delete player->hud[id];
2487-
player->hud[id] = NULL;
2488-
}
2473+
else if (event.type == CE_HUDRM) {
2474+
HudElement* e = player->removeHud(event.hudrm.id);
2475+
2476+
if (e != NULL)
2477+
delete (e);
24892478
}
2490-
else if (event.type == CE_HUDCHANGE)
2491-
{
2479+
else if (event.type == CE_HUDCHANGE) {
24922480
u32 id = event.hudchange.id;
2493-
if (id >= player->hud.size() || !player->hud[id]) {
2481+
HudElement* e = player->getHud(id);
2482+
if (e == NULL)
2483+
{
24942484
delete event.hudchange.v3fdata;
24952485
delete event.hudchange.v2fdata;
24962486
delete event.hudchange.sdata;
24972487
delete event.hudchange.v2s32data;
24982488
continue;
24992489
}
25002490

2501-
HudElement* e = player->hud[id];
25022491
switch (event.hudchange.stat) {
25032492
case HUD_STAT_POS:
25042493
e->pos = *event.hudchange.v2fdata;
@@ -2540,19 +2529,18 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
25402529
delete event.hudchange.sdata;
25412530
delete event.hudchange.v2s32data;
25422531
}
2543-
else if (event.type == CE_SET_SKY)
2544-
{
2532+
else if (event.type == CE_SET_SKY) {
25452533
sky->setVisible(false);
25462534
if(skybox){
25472535
skybox->drop();
25482536
skybox = NULL;
25492537
}
25502538
// Handle according to type
2551-
if(*event.set_sky.type == "regular"){
2539+
if(*event.set_sky.type == "regular") {
25522540
sky->setVisible(true);
25532541
}
25542542
else if(*event.set_sky.type == "skybox" &&
2555-
event.set_sky.params->size() == 6){
2543+
event.set_sky.params->size() == 6) {
25562544
sky->setFallbackBgColor(*event.set_sky.bgcolor);
25572545
skybox = smgr->addSkyBoxSceneNode(
25582546
tsrc->getTexture((*event.set_sky.params)[0]),
@@ -2574,8 +2562,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input,
25742562
delete event.set_sky.type;
25752563
delete event.set_sky.params;
25762564
}
2577-
else if (event.type == CE_OVERRIDE_DAY_NIGHT_RATIO)
2578-
{
2565+
else if (event.type == CE_OVERRIDE_DAY_NIGHT_RATIO) {
25792566
bool enable = event.override_day_night_ratio.do_override;
25802567
u32 value = event.override_day_night_ratio.ratio_f * 1000;
25812568
client.getEnv().setDayNightRatioOverride(enable, value);

Diff for: ‎src/hud.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,8 @@ void Hud::drawItems(v2s32 upperleftpos, s32 itemcount, s32 offset,
226226

227227

228228
void Hud::drawLuaElements(v3s16 camera_offset) {
229-
for (size_t i = 0; i != player->hud.size(); i++) {
230-
HudElement *e = player->hud[i];
229+
for (size_t i = 0; i != player->maxHudId(); i++) {
230+
HudElement *e = player->getHud(i);
231231
if (!e)
232232
continue;
233233

Diff for: ‎src/player.cpp

+39-7
Original file line numberDiff line numberDiff line change
@@ -216,19 +216,18 @@ void Player::deSerialize(std::istream &is, std::string playername)
216216
setPosition(args.getV3F("position"));
217217
try{
218218
hp = args.getS32("hp");
219-
}catch(SettingNotFoundException &e){
219+
}catch(SettingNotFoundException &e) {
220220
hp = 20;
221221
}
222222
try{
223223
m_breath = args.getS32("breath");
224-
}catch(SettingNotFoundException &e){
224+
}catch(SettingNotFoundException &e) {
225225
m_breath = 11;
226226
}
227227

228228
inventory.deSerialize(is);
229229

230-
if(inventory.getList("craftpreview") == NULL)
231-
{
230+
if(inventory.getList("craftpreview") == NULL) {
232231
// Convert players without craftpreview
233232
inventory.addList("craftpreview", 1);
234233

@@ -246,14 +245,47 @@ void Player::deSerialize(std::istream &is, std::string playername)
246245
checkModified();
247246
}
248247

249-
/*
250-
RemotePlayer
251-
*/
248+
u32 Player::addHud(HudElement *toadd)
249+
{
250+
u32 id = getFreeHudID();
252251

252+
if (id < hud.size())
253+
hud[id] = toadd;
254+
else
255+
hud.push_back(toadd);
253256

257+
return id;
258+
}
254259

260+
HudElement* Player::getHud(u32 id)
261+
{
262+
if (id < hud.size())
263+
return hud[id];
255264

265+
return NULL;
266+
}
256267

268+
HudElement* Player::removeHud(u32 id)
269+
{
270+
HudElement* retval = NULL;
271+
if (id < hud.size()) {
272+
retval = hud[id];
273+
hud[id] = NULL;
274+
}
275+
return retval;
276+
}
277+
278+
void Player::clearHud()
279+
{
280+
while(!hud.empty()) {
281+
delete hud.back();
282+
hud.pop_back();
283+
}
284+
}
285+
286+
/*
287+
RemotePlayer
288+
*/
257289
void RemotePlayer::setPosition(const v3f &position)
258290
{
259291
Player::setPosition(position);

Diff for: ‎src/player.h

+11-2
Original file line numberDiff line numberDiff line change
@@ -294,10 +294,17 @@ class Player
294294

295295
u32 keyPressed;
296296

297-
std::vector<HudElement *> hud;
297+
298+
HudElement* getHud(u32 id);
299+
u32 addHud(HudElement* hud);
300+
HudElement* removeHud(u32 id);
301+
void clearHud();
302+
u32 maxHudId() {
303+
return hud.size();
304+
}
305+
298306
u32 hud_flags;
299307
s32 hud_hotbar_itemcount;
300-
301308
protected:
302309
IGameDef *m_gamedef;
303310

@@ -314,6 +321,8 @@ class Player
314321
v3f m_last_pos;
315322
u16 m_last_hp;
316323
Inventory m_last_inventory;
324+
325+
std::vector<HudElement *> hud;
317326
};
318327

319328

Diff for: ‎src/script/lua_api/l_object.cpp

+4-8
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,9 @@ int ObjectRef::l_hud_change(lua_State *L)
971971
return 0;
972972

973973
u32 id = !lua_isnil(L, 2) ? lua_tonumber(L, 2) : -1;
974-
if (id >= player->hud.size())
974+
975+
HudElement *e = player->getHud(id);
976+
if (!e)
975977
return 0;
976978

977979
HudElementStat stat = HUD_STAT_NUMBER;
@@ -983,10 +985,6 @@ int ObjectRef::l_hud_change(lua_State *L)
983985
}
984986

985987
void *value = NULL;
986-
HudElement *e = player->hud[id];
987-
if (!e)
988-
return 0;
989-
990988
switch (stat) {
991989
case HUD_STAT_POS:
992990
e->pos = read_v2f(L, 4);
@@ -1049,10 +1047,8 @@ int ObjectRef::l_hud_get(lua_State *L)
10491047
return 0;
10501048

10511049
u32 id = lua_tonumber(L, -1);
1052-
if (id >= player->hud.size())
1053-
return 0;
10541050

1055-
HudElement *e = player->hud[id];
1051+
HudElement *e = player->getHud(id);
10561052
if (!e)
10571053
return 0;
10581054

Diff for: ‎src/server.cpp

+11-10
Original file line numberDiff line numberDiff line change
@@ -4560,24 +4560,25 @@ bool Server::showFormspec(const char *playername, const std::string &formspec, c
45604560
u32 Server::hudAdd(Player *player, HudElement *form) {
45614561
if (!player)
45624562
return -1;
4563-
4564-
u32 id = player->getFreeHudID();
4565-
if (id < player->hud.size())
4566-
player->hud[id] = form;
4567-
else
4568-
player->hud.push_back(form);
45694563

4564+
u32 id = player->addHud(form);
4565+
45704566
SendHUDAdd(player->peer_id, id, form);
4567+
45714568
return id;
45724569
}
45734570

45744571
bool Server::hudRemove(Player *player, u32 id) {
4575-
if (!player || id >= player->hud.size() || !player->hud[id])
4572+
if (!player)
45764573
return false;
45774574

4578-
delete player->hud[id];
4579-
player->hud[id] = NULL;
4575+
HudElement* todel = player->removeHud(id);
4576+
4577+
if (!todel)
4578+
return false;
45804579

4580+
delete todel;
4581+
45814582
SendHUDRemove(player->peer_id, id);
45824583
return true;
45834584
}
@@ -5047,7 +5048,7 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id)
50475048
isSingleplayer());
50485049

50495050
/* Clean up old HUD elements from previous sessions */
5050-
player->hud.clear();
5051+
player->clearHud();
50515052

50525053
/* Add object to environment */
50535054
m_env->addActiveObject(playersao);

0 commit comments

Comments
 (0)
Please sign in to comment.