From 83d6c17799c4d448a67ab5cdad02954282fa5c94 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 1 Nov 2008 13:33:18 +0000 Subject: server-side model loading, initial @dock function --- doc/manual.html | 15 ++++++++-- src/client/input.cc | 10 +++++-- src/client/keyboard.cc | 19 +++++++------ src/core/commandbuffer.cc | 36 ++++++++++++++++++------ src/core/entity.cc | 52 +++++++++++++++++++++++++++-------- src/core/entity.h | 41 +++++++++++++++------------ src/core/func.cc | 33 +++++++++++++++++++--- src/core/func.h | 16 +++++++++-- src/core/gameserver.cc | 20 ++++++++++---- src/core/parser.cc | 3 +- src/game/base/base.cc | 17 +++++++++++- src/game/base/ship.cc | 7 +++-- src/game/intro/convoy.cc | 2 +- src/game/intro/intro.cc | 2 +- src/model/engine.cc | 1 + src/render/draw.cc | 70 +++++++++++++++++++++-------------------------- src/render/render.cc | 3 +- 17 files changed, 238 insertions(+), 109 deletions(-) diff --git a/doc/manual.html b/doc/manual.html index 7508b4b..d1d1781 100644 --- a/doc/manual.html +++ b/doc/manual.html @@ -80,6 +80,11 @@ bind p screenshot pitch + keypad home pgup + roll + + + keypad + - increase/decrease forward thruster @@ -93,11 +98,11 @@ bind p screenshot a d - strafe left/right + strafe - q / e - roll left/right + q e + roll w s @@ -117,6 +122,10 @@ bind p screenshot t + chat box + + + enter chat window diff --git a/src/client/input.cc b/src/client/input.cc index 7188de0..d4ccb17 100644 --- a/src/client/input.cc +++ b/src/client/input.cc @@ -482,6 +482,8 @@ Key::Modifier convert_SDL_modifier(int const sdlmodifier) void key_pressed(Key *key) { + // FIXME implement a real 'console key' + if (key->bind(Key::None).compare("ui_console") == 0) { // FIXME bah local_direction = 0.0f; @@ -510,10 +512,14 @@ void key_pressed(Key *key) } else if (core::application()->connected() && core::localcontrol()) { char c = key->bind(convert_SDL_modifier(keyboard_modifiers)).c_str()[0]; - if (c == '+') { + if (c == '@') { + // target bind + if (targets::current_id()) + core::cmd() << key->bind(convert_SDL_modifier(keyboard_modifiers)) << " " << targets::current_id() <<"\n"; + } else if (c == '+') { // action bind action_press(key, key->bind(convert_SDL_modifier(keyboard_modifiers))); - } else if (c) { + } else { // normal bind core::cmd() << key->bind(convert_SDL_modifier(keyboard_modifiers)) << "\n"; } diff --git a/src/client/keyboard.cc b/src/client/keyboard.cc index b4b0e3a..a29b601 100644 --- a/src/client/keyboard.cc +++ b/src/client/keyboard.cc @@ -30,8 +30,7 @@ Keyboard::Keyboard() // ------------------ ACTIONS - // note: actions should be state keys and not use key repeat - // FIXME: thruster should be a state key + // FIXME actions should be state keys and not use key repeat add_action("+left", Action::None, "rotate left"); add_action("+right", Action::None, "rotate right"); @@ -57,13 +56,17 @@ Keyboard::Keyboard() add_action("+control", Action::None, "enable mouse control while pressed"); + // TODO the @ is a hack for functions that take the current entity as param + + add_action("@dock", Action::None, "send docking request to target"); + // ------------------ KEYS Key *key = 0; add_key("backspace", SDLK_BACKSPACE); add_key("tab", SDLK_TAB, 0, "impulse"); add_key("clear", SDLK_CLEAR); - key = add_key("enter", SDLK_RETURN); + key = add_key("enter", SDLK_RETURN, 0, "ui_chat"); key->assign(Key::Alt, "toggle r_fullscreen"); add_key("pause", SDLK_PAUSE); add_key("esc", SDLK_ESCAPE); @@ -147,13 +150,13 @@ Keyboard::Keyboard() add_key("kp4", SDLK_KP4, 0, "+left"); add_key("kp5", SDLK_KP5); add_key("kp6", SDLK_KP6, 0, "+right"); - add_key("kp7", SDLK_KP7); + add_key("kp7", SDLK_KP7, 0, "+rollleft"); add_key("kp8", SDLK_KP8, 0, "+down"); - add_key("kp9", SDLK_KP9); + add_key("kp9", SDLK_KP9, 0, "+rollright"); add_key("kpperiod", SDLK_KP_PERIOD, '.'); - add_key("kpdiv", SDLK_KP_DIVIDE, '/', "+rollleft"); - add_key("kpmul", SDLK_KP_MULTIPLY, '*', "+rollright"); + add_key("kpdiv", SDLK_KP_DIVIDE, '/'); + add_key("kpmul", SDLK_KP_MULTIPLY, '*'); add_key("kpmin", SDLK_KP_MINUS, '-', "+thrustdown"); add_key("kpplus", SDLK_KP_PLUS, '+', "+thrustup"); add_key("kpenter", SDLK_KP_ENTER, '\n', "ui_chat"); @@ -172,7 +175,7 @@ Keyboard::Keyboard() add_key("f1", SDLK_F1); add_key("f2", SDLK_F2); - add_key("f3", SDLK_F3); + add_key("f3", SDLK_F3, 0, "@dock"); key = add_key("f4", SDLK_F4); #ifdef _WIN32 key->assign(Key::Alt, "quit"); diff --git a/src/core/commandbuffer.cc b/src/core/commandbuffer.cc index 8c3c8a1..d3cb4f2 100644 --- a/src/core/commandbuffer.cc +++ b/src/core/commandbuffer.cc @@ -231,19 +231,39 @@ void CommandBuffer::exec(std::string const &cmdline) // is it a function Func *f = Func::find(command); if (f) { - std::string args; - char c; - if (cmdstream >> args) { - while (cmdstream.get(c)) - args += c; - } - // console can not execute game functions, and neither should rcon if ((f->flags() & Func::Game) && (Cvar::sv_dedicated->value() == 0)) { + if (application()->connected()) { - f->exec(game()->localplayer(), args); + + if ((f->flags() & Func::Target)) { + // target function + unsigned int id = 0; + if ((cmdstream >> id)) { + con_debug << "target function " << command << " " << id << std::endl; + Entity *entity = Entity::find(id); + if (entity) + f->exec(game()->localplayer(), entity); + } + } else { + // game function + std::string args; + char c; + if (cmdstream >> args) { + while (cmdstream.get(c)) + args += c; + } + f->exec(game()->localplayer(), args); + } } } else { + // regular function + std::string args; + char c; + if (cmdstream >> args) { + while (cmdstream.get(c)) + args += c; + } f->exec(args); } return; diff --git a/src/core/entity.cc b/src/core/entity.cc index 2c63b18..f9062e0 100644 --- a/src/core/entity.cc +++ b/src/core/entity.cc @@ -102,7 +102,6 @@ Entity::Entity(unsigned int flags) : entity_dirty = false; entity_model = 0; - entity_modelname.clear(); entity_label.clear(); entity_name.clear(); @@ -213,22 +212,53 @@ void Entity::hide() entity_visible = false; } +void Entity::set_flag(Flags flag) +{ + entity_flags |= flag; +} + +void Entity::unset_flag(Flags flag) +{ + entity_flags &= ~flag; +} + +void Entity::set_model(model::Model *model) +{ + entity_model = model; + if (entity_model) { + entity_radius = entity_model->radius(); + entity_modelname = entity_model->name(); + } +} + +void Entity::set_modelname(const std::string &modelname) +{ + if (!modelname.size()) { + set_model(0); + } else { + set_model(model::Model::load(modelname)); + } + + if (!entity_model) + entity_modelname.clear(); +} + void Entity::serialize_server_create(std::ostream & os) const { - os << entity_moduletypeid << " " - << entity_flags << " " - << (entity_visible ? 1 : 0) << " " - << (entity_zone ? entity_zone->id() : 0) << " " + os << moduletype() << " " + << flags() << " " + << (visible() ? 1 : 0) << " " + << (zone() ? zone()->id() : 0) << " " << std::setprecision(8) << entity_location << " " - << entity_color << " " - << entity_color_second << " " - << entity_shape << " " - << entity_radius << " " + << color() << " " + << color_second() << " " + << shape() << " " + << radius() << " " << std::setprecision(8) << entity_axis.forward() << " " << std::setprecision(8) << entity_axis.left() << " " << "\"" << entity_label << "\" " << "\"" << entity_name << "\" " - << "\"" << entity_modelname << "\" "; + << "\"" << (entity_model ? entity_model->name() : "") << "\" "; } void Entity::receive_server_create(std::istream &is) @@ -288,8 +318,8 @@ void Entity::receive_server_create(std::istream &is) while ( (is.get(c)) && (c != '"')); while ( (is.get(c)) && (c != '"')) n += c; - entity_modelname = n; + set_modelname(n); entity_dirty = false; } diff --git a/src/core/entity.h b/src/core/entity.h index 2c4814e..149419b 100644 --- a/src/core/entity.h +++ b/src/core/entity.h @@ -35,10 +35,7 @@ class Entity { public: /// Entity flags - /** - * entities with the Static flag set will not get client-side interpolation - */ - enum Flags {Static=1, Solid=2, Bright=4}; + enum Flags {Static=1, Solid=2, Bright=4, Dock=8}; /// Entity type constants enum Type {Default=0, Dynamic=1, Controlable=2, Globe=3}; @@ -78,15 +75,15 @@ public: /// entity name (can not contain double qoutes ") inline std::string const & name() { return entity_name; } - /// entity model name - inline std::string const & modelname() { return entity_modelname; } - /// entity client render state inline ClientState * state() { return entity_clientstate; } /// pointer to the model, is used client-side inline model::Model * model() { return entity_model; } + /// modelname + inline const std::string & modelname() const { return entity_modelname; } + /// pointer to the zone the entity belongs to inline Zone *zone() const { return entity_zone; } @@ -176,12 +173,24 @@ public: /// set visibility void set_visible(bool visible = true); + /// set the model name and load the model + void set_modelname(const std:: string &model); + + /// set the model + void set_model(model::Model *model); + /// show the entity, make it visible virtual void show(); /// hide the entity, make it invisible virtual void hide(); + /// set a flag + void set_flag(Flags flag); + + /// unset a flag + void unset_flag(Flags flag); + /// clear all update flags virtual void clear_updates(); @@ -210,13 +219,10 @@ public: math::Axis entity_axis; float entity_radius; - std::string entity_modelname; - model::Model *entity_model; Shape entity_shape; math::Color entity_color; math::Color entity_color_second; unsigned int entity_moduletypeid; - unsigned int entity_flags; bool entity_dirty; bool entity_created; @@ -236,19 +242,20 @@ protected: bool entity_visible; bool entity_serverside; +private: + unsigned int entity_id; + unsigned int entity_flags; + std::string entity_name; std::string entity_label; -private: - // add an entity to the registry - static void add(Entity *ent); - - // the id is set by add() - unsigned int entity_id; + model::Model *entity_model; + std::string entity_modelname; - // the entity registry static Registry entity_registry; static size_t entity_nextid; + + static void add(Entity *ent); }; diff --git a/src/core/func.cc b/src/core/func.cc index 81175f8..42c46c8 100644 --- a/src/core/func.cc +++ b/src/core/func.cc @@ -18,12 +18,12 @@ namespace core Func::Registry Func::func_registry; -Func * Func::add(const char *name, FuncPtr functionptr, unsigned int flags) +Func * Func::add(const char *name, FuncPtr functionptr, bool shared) { Func *func = 0; Registry::iterator it = func_registry.find(name); if (it == func_registry.end()) { - func = new Func(name, (void *)functionptr, flags & ~Func::Game); + func = new Func(name, (void *)functionptr, shared ? Shared : 0); func_registry[std::string(name)] = func; //con_debug << "Function '" << name << "' registered." << std::endl; } else { @@ -33,12 +33,27 @@ Func * Func::add(const char *name, FuncPtr functionptr, unsigned int flags) return func; } -Func *Func::add(const char *name, GameFuncPtr gamefunctionptr, unsigned int flags) +Func *Func::add(const char *name, GameFuncPtr gamefunctionptr) { Func *func = 0; Registry::iterator it = func_registry.find(name); if (it == func_registry.end()) { - func = new Func(name, (void *)gamefunctionptr, flags | Func::Game); + func = new Func(name, (void *)gamefunctionptr, Game); + func_registry[func->name()] = func; + //con_debug << "Function '" << name << "' registered." << std::endl; + } else { + con_warn << "Function '" << name << "' already registered!" << std::endl; + func = (*it).second; + } + return func; +} + +Func *Func::add(const char *name, TargetFuncPtr targetfunctionptr) +{ + Func *func = 0; + Registry::iterator it = func_registry.find(name); + if (it == func_registry.end()) { + func = new Func(name, (void *)targetfunctionptr, Game | Target); func_registry[func->name()] = func; //con_debug << "Function '" << name << "' registered." << std::endl; } else { @@ -145,5 +160,15 @@ void Func::exec(Player *player, std::string const &args) gamefunction(player, args); } +void Func::exec(Player *player, Entity *entity) +{ + if (!(flags() & (Game | Target))) + return; + + TargetFuncPtr targetfunction = (TargetFuncPtr) func_ptr; + targetfunction(player, entity); + +} + } // namespace core diff --git a/src/core/func.h b/src/core/func.h index 7c5635f..eacd47e 100644 --- a/src/core/func.h +++ b/src/core/func.h @@ -8,6 +8,7 @@ #define __INCLUDED_CORE_FUNC_H__ #include "core/player.h" +#include "core/entity.h" #include #include @@ -22,12 +23,15 @@ typedef void(* FuncPtr)(std::string const &args); /// fuction pointer for game functions typedef void(* GameFuncPtr)(Player *player, std::string const &args); +/// fuction pointer for target functions +typedef void(* TargetFuncPtr)(Player *player, Entity *entity); + /// a function pointer encapsulation class class Func { public: /// function flags - enum Flags {Game=1, Shared=2}; + enum Flags {Game=1, Shared=2, Target=4}; /// create a new function Func(char const * name, void *ptr, unsigned int flags = 0); @@ -56,16 +60,22 @@ public: /// execute the function if the Game flag is set void exec(Player *player, std::string const &args); + /// execute the function if the Target flag is set + void exec(Player *player, Entity *entity); + /* ---- Static functions for the Func registry -------------------- */ /// type definition typedef std::map Registry; /// add a function to the registry - static Func *add(const char *name, FuncPtr functionptr, unsigned int flags=0); + static Func *add(const char *name, FuncPtr functionptr, bool shared=false); /// add a game function to the registry and set the Game flag - static Func *add(const char *name, GameFuncPtr functionptr, unsigned int flags=0); + static Func *add(const char *name, GameFuncPtr functionptr); + + /// add a target function to the registry and set Game and Target flag + static Func *add(const char *name, TargetFuncPtr targetfunctionptr); /// remove a function from the registry static void remove(const char *name); diff --git a/src/core/gameserver.cc b/src/core/gameserver.cc index 4da0be6..3268e38 100644 --- a/src/core/gameserver.cc +++ b/src/core/gameserver.cc @@ -178,11 +178,11 @@ GameServer::GameServer() : GameInterface() func = Func::add("revoke_rcon", func_grant_rcon); func->set_info("[player] revoke rcon rights"); */ - /* -- player functions --*/ - func = Func::add("time", func_time, Func::Shared); + /* -- shared functions --*/ + func = Func::add("time", func_time, true); func->set_info("get the server uptime and current server localtime"); - func = Func::add("who", func_who, Func::Shared); + func = Func::add("who", func_who, true); func->set_info("get a list of connected players"); if (!Cvar::sv_dedicated->value()) { @@ -489,8 +489,16 @@ void GameServer::exec(Player *player, std::string const & cmdline) args.assign(cmdline.substr(command.size()+1)); if ((function ->flags() & Func::Game) == Func::Game) { - function->exec(player, args); - return; + if ((function ->flags() & Func::Target) == Func::Target) { + unsigned int id = 0; + if ((cmdstream >> id)) { + Entity *entity = Entity::find(id); + if (entity) + function->exec(player, entity); + } + } else { + function->exec(player, args); + } } else if ((function->flags() & Func::Shared) == Func::Shared) { @@ -505,8 +513,8 @@ void GameServer::exec(Player *player, std::string const & cmdline) // disable rcon buffering console()->set_rcon(false); - return; } + return; } std::string message("Unknown command '"); diff --git a/src/core/parser.cc b/src/core/parser.cc index 99dc1d5..39eb073 100644 --- a/src/core/parser.cc +++ b/src/core/parser.cc @@ -43,7 +43,8 @@ bool Parser::got_entity_key(filesystem::IniFile &inifile, core::Entity *entity) } else if (inifile.got_key_string("name", strval)) { entity->set_name(strval); return true; - } else if (inifile.got_key_string("model", entity->entity_modelname)) { + } else if (inifile.got_key_string("model", strval)) { + entity->set_modelname(strval); return true; } else if (inifile.got_key_angle("direction", direction)) { entity->axis().change_direction(direction); diff --git a/src/game/base/base.cc b/src/game/base/base.cc index 738db04..6a3738e 100644 --- a/src/game/base/base.cc +++ b/src/game/base/base.cc @@ -159,6 +159,18 @@ void func_impulse(core::Player *player, std::string const &args) ship->impulse(); } +/// a player sends a docking request +void func_dock(core::Player *player,core::Entity *entity) +{ + if (!player->control()) + return; + + if (player->control()->zone() != entity->zone()) + return; + + core::server()->send(player, "^BSending docking request to " + entity->name() + "^B..."); +} + /* -- class Base static members ----------------------------------- */ // game variables @@ -211,6 +223,9 @@ void Base::init() func = core::Func::add("buy", (core::GameFuncPtr) func_buy); func->set_info("buy a ship"); + func = core::Func::add("@dock", (core::TargetFuncPtr) func_dock); + func->set_info("send a docking request"); + func = core::Func::add("jump", (core::GameFuncPtr) func_jump); func->set_info("[string] activate or deactivate hyperspace jump drive"); @@ -389,7 +404,7 @@ bool Base::load_zone(core::Zone *zone) } else if (zoneini.got_section("entity")) { entity = new core::Entity(); - entity->entity_flags += core::Entity::Static; + entity->set_flag(core::Entity::Static); entity->set_zone(zone); count ++; diff --git a/src/game/base/ship.cc b/src/game/base/ship.cc index 574d66c..412668d 100644 --- a/src/game/base/ship.cc +++ b/src/game/base/ship.cc @@ -26,9 +26,9 @@ const float MIN_DELTA = 0.000001f; Ship::Ship(core::Player *owner, ShipModel *shipmodel) : core::EntityControlable(owner, ship_enttype) { - entity_modelname = "ships/" + shipmodel->modelname(); - entity_name = shipmodel->name() + ": <^B" + owner->name() + "^N>"; - entity_label = shipmodel->label(); + set_modelname("ships/" + shipmodel->modelname()); + set_name(shipmodel->name() + ": <^B" + owner->name() + "^N>"); + set_label(shipmodel->label()); entity_moduletypeid = ship_enttype; @@ -266,6 +266,7 @@ void Ship::frame(float seconds) entity_dirty = true; // FIXME 5 second cooldown + entity_speed = Base::g_impulsespeed->value(); entity_eventstate = core::Entity::Normal; } else if (entity_eventstate == core::Entity::ImpulseInitiate) { diff --git a/src/game/intro/convoy.cc b/src/game/intro/convoy.cc index 226f8fa..c0fba52 100644 --- a/src/game/intro/convoy.cc +++ b/src/game/intro/convoy.cc @@ -16,7 +16,7 @@ Member::Member(std::string const &model) : core::EntityControlable(0, 1) set_name("Convoy member"); set_label(model); - entity_modelname = "ships/" + model; + set_modelname("ships/" + model); entity_thrust = 1.0f; /* diff --git a/src/game/intro/intro.cc b/src/game/intro/intro.cc index 55f038f..efb3b40 100644 --- a/src/game/intro/intro.cc +++ b/src/game/intro/intro.cc @@ -117,7 +117,7 @@ bool Intro::load_world() } else if (ini.got_key_float("rotationspeed", globe->entity_rotationspeed)) { continue; } else if (ini.got_key_bool("bright", b)) { - if (b) { globe->entity_flags |= core::Entity::Bright; } + if (b) { globe->set_flag(core::Entity::Bright); } } else if (ini.got_key()) { ini.unkown_key(); } diff --git a/src/model/engine.cc b/src/model/engine.cc index 706de15..97011d9 100644 --- a/src/model/engine.cc +++ b/src/model/engine.cc @@ -18,6 +18,7 @@ Engine::Engine() : { engine_radius = 1.0f; engine_flare = 0; + render_texture = 0; engine_notrail = false; engine_noflare = false; diff --git a/src/render/draw.cc b/src/render/draw.cc index 69dcecb..7bbb89c 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -53,8 +53,8 @@ typedef std::map Globes; Globes globes_list; // function to test flags -inline bool flag_is_set(unsigned int const spawnflags, unsigned int const flag) { - return ((spawnflags & flag) == flag); +inline bool flag_is_set(unsigned int const flags, unsigned int const flag) { + return ((flags & flag) == flag); } /* ---- Prepare the renderer state --------------------------------- */ @@ -75,51 +75,43 @@ void pass_prepare(float seconds) core::Entity *entity = (*it); // load entity models and light flare textures - if (!entity->model() && entity->modelname().size()) { - entity->entity_model = Model::load(entity->modelname()); - - if (!entity->model()) { - entity->entity_modelname.clear(); - entity->entity_radius = 0.25; - } else { - // set entity radius to model radius - entity->entity_radius = entity->entity_model->radius(); + if (!entity->model() && entity->modelname().c_str()[0]) { + entity->set_modelname(entity->modelname()); + } + + if (entity->model()) { + model::Model *model = entity->model(); - for (Model::Lights::iterator lit = entity->model()->lights().begin(); lit != entity->model()->lights().end(); lit++) { - Light *light = (*lit); + for (Model::Lights::iterator lit = model->lights().begin(); lit != model->lights().end(); lit++) { + Light *light = (*lit); - // load light texture - std::stringstream flarename; - flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << light->flare(); - light->render_texture = Textures::load(flarename.str()); - } + // load light texture + std::stringstream flarename; + flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << light->flare(); + light->render_texture = Textures::load(flarename.str()); + } - for(Model::Engines::iterator eit = entity->model()->engines().begin(); eit != entity->model()->engines().end(); eit++) { - Engine *engine = (*eit); + for(Model::Engines::iterator eit = model->engines().begin(); eit != model->engines().end(); eit++) { + Engine *engine = (*eit); - if (!engine->flare()) engine->engine_flare = 1; + if (!engine->flare()) engine->engine_flare = 1; - // load engine texture - std::stringstream flarename; - flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << engine->flare(); - engine->render_texture = Textures::load(flarename.str()); - } + // load engine texture + std::stringstream flarename; + flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << engine->flare(); + engine->render_texture = Textures::load(flarename.str()); + } - for (Model::Flares::iterator flit = entity->model()->flares().begin(); flit != entity->model()->flares().end(); flit++) { - Flare *flare = (*flit); + for (Model::Flares::iterator flit = model->flares().begin(); flit != model->flares().end(); flit++) { + Flare *flare = (*flit); - // load flare texture - std::stringstream flarename; - flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << flare->flare(); - flare->render_texture = Textures::load(flarename.str()); - } + // load flare texture + std::stringstream flarename; + flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << flare->flare(); + flare->render_texture = Textures::load(flarename.str()); } } - - if (!entity->state()) { - entity->entity_clientstate = new core::ClientState(entity); - } - + entity->state()->state_visible = false; entity->state()->state_detailvisible = false; entity->state()->state_targetable = false; @@ -147,8 +139,8 @@ void pass_prepare(float seconds) if (entity->type() == core::Entity::Globe) { core::EntityGlobe *globe = static_cast(entity); - // add the globe to the globes list + // add the globe to the globes list globes_list[globe->state()->distance()] = globe; // load globe textures diff --git a/src/render/render.cc b/src/render/render.cc index 55756d9..02bd586 100644 --- a/src/render/render.cc +++ b/src/render/render.cc @@ -184,6 +184,7 @@ void unload() // clear all assets void clear() { + con_debug << "Clearing render data...\n"; // clear zone sky textures for (core::Zone::Registry::iterator it = core::Zone::registry().begin(); it != core::Zone::registry().end(); it++) { core::Zone *zone = (*it).second; @@ -195,7 +196,7 @@ void clear() core::Entity *entity = (*it).second; if (entity->model()) - entity->entity_model = 0; + entity->set_model(0); if (entity->type() == core::Entity::Globe) { core::EntityGlobe *globe = static_cast(entity); -- cgit v1.2.3