forked from oerkki/voxelands
Compare commits
1 Commits
Author | SHA1 | Date |
---|---|---|
|
ea789f4f97 |
|
@ -285,6 +285,7 @@ endif()
|
||||||
set(voxelands_SRCS
|
set(voxelands_SRCS
|
||||||
${common_SRCS}
|
${common_SRCS}
|
||||||
${audio_SRCS}
|
${audio_SRCS}
|
||||||
|
ui_console.c
|
||||||
sky.cpp
|
sky.cpp
|
||||||
hud.cpp
|
hud.cpp
|
||||||
content_mapblock.cpp
|
content_mapblock.cpp
|
||||||
|
|
|
@ -1234,10 +1234,8 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
|
||||||
message += (wchar_t)readU16(buf);
|
message += (wchar_t)readU16(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* because I can't remember which random stream prints to stdout */
|
/* this will print to game console, system console, and log file */
|
||||||
vlprint(CN_CHAT,(char*)wide_to_narrow(message).c_str());
|
vlprint(CN_CHAT,(char*)wide_to_narrow(message).c_str());
|
||||||
|
|
||||||
m_chat_queue.push_back(message);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD:
|
case TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD:
|
||||||
|
|
26
src/client.h
26
src/client.h
|
@ -275,30 +275,6 @@ public:
|
||||||
u16 getHunger();
|
u16 getHunger();
|
||||||
float getEnergy();
|
float getEnergy();
|
||||||
|
|
||||||
bool getChatMessage(std::wstring &message)
|
|
||||||
{
|
|
||||||
if(m_chat_queue.size() == 0)
|
|
||||||
return false;
|
|
||||||
message = m_chat_queue.pop_front();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void addChatMessage(const std::wstring &message)
|
|
||||||
{
|
|
||||||
if (message[0] == L'/') {
|
|
||||||
m_chat_queue.push_back(
|
|
||||||
(std::wstring)L"issued command: "+message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//JMutexAutoLock envlock(m_env_mutex); //bulk comment-out
|
|
||||||
LocalPlayer *player = m_env.getLocalPlayer();
|
|
||||||
assert(player != NULL);
|
|
||||||
std::wstring name = narrow_to_wide(player->getName());
|
|
||||||
m_chat_queue.push_back(
|
|
||||||
(std::wstring)L"<"+name+L"> "+message);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t getMapSeed() {return m_map_seed;}
|
uint64_t getMapSeed() {return m_map_seed;}
|
||||||
MapGenType getMapType() {return m_map_type;}
|
MapGenType getMapType() {return m_map_type;}
|
||||||
|
|
||||||
|
@ -400,8 +376,6 @@ private:
|
||||||
|
|
||||||
bool m_form_open;
|
bool m_form_open;
|
||||||
|
|
||||||
Queue<std::wstring> m_chat_queue;
|
|
||||||
|
|
||||||
// The seed returned by the server in TOCLIENT_INIT is stored here
|
// The seed returned by the server in TOCLIENT_INIT is stored here
|
||||||
uint64_t m_map_seed;
|
uint64_t m_map_seed;
|
||||||
MapGenType m_map_type;
|
MapGenType m_map_type;
|
||||||
|
|
|
@ -207,6 +207,13 @@ void world_exit(void);
|
||||||
worldlist_t *world_list_get(void);
|
worldlist_t *world_list_get(void);
|
||||||
void world_list_free(worldlist_t *l);
|
void world_list_free(worldlist_t *l);
|
||||||
|
|
||||||
|
/* defined in ui_console.c */
|
||||||
|
void ui_console_addline(uint8_t type, char* txt);
|
||||||
|
void ui_console_addlinef(uint8_t type, char* fmt, ...);
|
||||||
|
void ui_console_clear(void);
|
||||||
|
int ui_console_step(float dtime);
|
||||||
|
char* ui_console_get(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
|
@ -31,7 +31,7 @@ void config_default_init()
|
||||||
config_set_default("log.max_level","info",log_maxlevel_setter);
|
config_set_default("log.max_level","info",log_maxlevel_setter);
|
||||||
config_set_default("log.system.min_level","chat",log_sminlevel_setter);
|
config_set_default("log.system.min_level","chat",log_sminlevel_setter);
|
||||||
config_set_default("log.system.max_level","info",log_smaxlevel_setter);
|
config_set_default("log.system.max_level","info",log_smaxlevel_setter);
|
||||||
config_set_default("log.console.min_level","chat",log_cminlevel_setter);
|
config_set_default("log.console.min_level","action",log_cminlevel_setter);
|
||||||
config_set_default("log.console.max_level","info",log_cmaxlevel_setter);
|
config_set_default("log.console.max_level","info",log_cmaxlevel_setter);
|
||||||
|
|
||||||
config_set_default("path.log",NULL,log_file_setter);
|
config_set_default("path.log",NULL,log_file_setter);
|
||||||
|
|
153
src/game.cpp
153
src/game.cpp
|
@ -68,17 +68,6 @@
|
||||||
#define swprintf _snwprintf
|
#define swprintf _snwprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
Setting this to 1 enables a special camera mode that forces
|
|
||||||
the renderers to think that the camera statically points from
|
|
||||||
the starting place to a static direction.
|
|
||||||
|
|
||||||
This allows one to move around with the player and see what
|
|
||||||
is actually drawn behind solid things and behind the player.
|
|
||||||
*/
|
|
||||||
#define FIELD_OF_VIEW_TEST 0
|
|
||||||
|
|
||||||
|
|
||||||
// Chat data
|
// Chat data
|
||||||
struct ChatLine
|
struct ChatLine
|
||||||
{
|
{
|
||||||
|
@ -136,7 +125,7 @@ public:
|
||||||
// Send to others
|
// Send to others
|
||||||
m_client->sendChatMessage(fields["text"]);
|
m_client->sendChatMessage(fields["text"]);
|
||||||
// Show locally
|
// Show locally
|
||||||
m_client->addChatMessage(fields["text"]);
|
ui_console_addline(CN_CHAT,(char*)wide_to_narrow(fields["text"]).c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -661,16 +650,6 @@ void update_profiler_gui(gui::IGUIStaticText *guitext_profiler,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void chatline_add(ref_t **chat_lines, std::wstring txt, float time)
|
|
||||||
{
|
|
||||||
ref_t *ref = (ref_t*)malloc(sizeof(ref_t));
|
|
||||||
if (!ref)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ref->ref = new ChatLine(txt,time);
|
|
||||||
*chat_lines = (ref_t*)list_push(chat_lines,ref);
|
|
||||||
}
|
|
||||||
|
|
||||||
void the_game(
|
void the_game(
|
||||||
bool &kill,
|
bool &kill,
|
||||||
InputHandler *input,
|
InputHandler *input,
|
||||||
|
@ -693,7 +672,6 @@ void the_game(
|
||||||
gui::IGUIStaticText *guitext_info;
|
gui::IGUIStaticText *guitext_info;
|
||||||
gui::IGUIStaticText *guitext_chat;
|
gui::IGUIStaticText *guitext_chat;
|
||||||
gui::IGUIStaticText *guitext_profiler;
|
gui::IGUIStaticText *guitext_profiler;
|
||||||
ref_t *chat_lines = NULL;
|
|
||||||
u32 drawtime = 0;
|
u32 drawtime = 0;
|
||||||
core::list<float> frametime_log;
|
core::list<float> frametime_log;
|
||||||
float action_delay_counter = 0.0;
|
float action_delay_counter = 0.0;
|
||||||
|
@ -745,6 +723,8 @@ void the_game(
|
||||||
*/
|
*/
|
||||||
drawLoadingScreen(device,narrow_to_wide(gettext("Loading...")));
|
drawLoadingScreen(device,narrow_to_wide(gettext("Loading...")));
|
||||||
|
|
||||||
|
ui_console_clear();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Create server.
|
Create server.
|
||||||
SharedPtr will delete it when it goes out of scope.
|
SharedPtr will delete it when it goes out of scope.
|
||||||
|
@ -1171,10 +1151,10 @@ void the_game(
|
||||||
}else if(input->wasKeyDown(getKeySetting(VLKC_FREEMOVE))) {
|
}else if(input->wasKeyDown(getKeySetting(VLKC_FREEMOVE))) {
|
||||||
if (free_move) {
|
if (free_move) {
|
||||||
free_move = false;
|
free_move = false;
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("free_move disabled")),-103.00);
|
vlprint(CN_ACTION,gettext("free_move disabled"));
|
||||||
}else{
|
}else{
|
||||||
free_move = true;
|
free_move = true;
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("free_move enabled")),-103.00);
|
vlprint(CN_ACTION,gettext("free_move enabled"));
|
||||||
}
|
}
|
||||||
}else if(input->wasKeyDown(getKeySetting(VLKC_SCREENSHOT))) {
|
}else if(input->wasKeyDown(getKeySetting(VLKC_SCREENSHOT))) {
|
||||||
irr::video::IImage* const image = driver->createScreenShot();
|
irr::video::IImage* const image = driver->createScreenShot();
|
||||||
|
@ -1186,10 +1166,7 @@ void the_game(
|
||||||
}else{
|
}else{
|
||||||
if (path_get((char*)"screenshot",fn,0,path,1024)) {
|
if (path_get((char*)"screenshot",fn,0,path,1024)) {
|
||||||
if (driver->writeImageToFile(image, io::path(path))) {
|
if (driver->writeImageToFile(image, io::path(path))) {
|
||||||
char buff[512];
|
vlprintf(CN_ACTION,gettext("Saved screenshot to '%s'"), path);
|
||||||
snprintf(buff, 512, gettext("Saved screenshot to '%s'"), path);
|
|
||||||
infostream << "Saved screenshot to '" << fn << "'" << std::endl;
|
|
||||||
chatline_add(&chat_lines,narrow_to_wide(buff),-103.00);
|
|
||||||
}else{
|
}else{
|
||||||
infostream << "Failed to save screenshot '" << fn << "'"<<std::endl;
|
infostream << "Failed to save screenshot '" << fn << "'"<<std::endl;
|
||||||
}
|
}
|
||||||
|
@ -1200,30 +1177,30 @@ void the_game(
|
||||||
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_HUD))) {
|
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_HUD))) {
|
||||||
show_hud = !show_hud;
|
show_hud = !show_hud;
|
||||||
if (show_hud) {
|
if (show_hud) {
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("HUD shown")),-103.00);
|
vlprint(CN_ACTION,gettext("HUD shown"));
|
||||||
}else{
|
}else{
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("HUD hidden")),-103.00);
|
vlprint(CN_ACTION,gettext("HUD hidden"));
|
||||||
}
|
}
|
||||||
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_CHAT))) {
|
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_CHAT))) {
|
||||||
show_chat = !show_chat;
|
show_chat = !show_chat;
|
||||||
if (show_chat) {
|
if (show_chat) {
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Chat shown")),-103.00);
|
vlprint(CN_ACTION,gettext("Chat shown"));
|
||||||
}else{
|
}else{
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Chat hidden")),-103.00);
|
vlprint(CN_ACTION,gettext("Chat hidden"));
|
||||||
}
|
}
|
||||||
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_FOG))) {
|
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_FOG))) {
|
||||||
force_fog_off = !force_fog_off;
|
force_fog_off = !force_fog_off;
|
||||||
if (force_fog_off) {
|
if (force_fog_off) {
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Fog disabled")),-103.00);
|
vlprint(CN_ACTION,gettext("Fog disabled"));
|
||||||
}else{
|
}else{
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Fog enabled")),-103.00);
|
vlprint(CN_ACTION,gettext("Fog enabled"));
|
||||||
}
|
}
|
||||||
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_CAMERA))) {
|
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_CAMERA))) {
|
||||||
disable_camera_update = !disable_camera_update;
|
disable_camera_update = !disable_camera_update;
|
||||||
if (disable_camera_update) {
|
if (disable_camera_update) {
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Camera update disabled")),-103.00);
|
vlprint(CN_ACTION,gettext("Camera update disabled"));
|
||||||
}else{
|
}else{
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Camera update enabled")),-103.00);
|
vlprint(CN_ACTION,gettext("Camera update enabled"));
|
||||||
}
|
}
|
||||||
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_DEBUG))) {
|
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_DEBUG))) {
|
||||||
// Initial / 3x toggle: Chat only
|
// Initial / 3x toggle: Chat only
|
||||||
|
@ -1232,14 +1209,14 @@ void the_game(
|
||||||
if (!show_debug) {
|
if (!show_debug) {
|
||||||
show_debug = true;
|
show_debug = true;
|
||||||
show_debug_frametime = false;
|
show_debug_frametime = false;
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Debug info shown")),-103.00);
|
vlprint(CN_ACTION,gettext("Debug info shown"));
|
||||||
}else if (show_debug_frametime) {
|
}else if (show_debug_frametime) {
|
||||||
show_debug = false;
|
show_debug = false;
|
||||||
show_debug_frametime = false;
|
show_debug_frametime = false;
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Debug info and frametime graph hidden")),-103.00);
|
vlprint(CN_ACTION,gettext("Debug info and frametime graph hidden"));
|
||||||
}else{
|
}else{
|
||||||
show_debug_frametime = true;
|
show_debug_frametime = true;
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Frametime graph shown")),-103.00);
|
vlprint(CN_ACTION,gettext("Frametime graph shown"));
|
||||||
}
|
}
|
||||||
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_PROFILER))) {
|
}else if (input->wasKeyDown(getKeySetting(VLKC_TOGGLE_PROFILER))) {
|
||||||
show_profiler = (show_profiler + 1) % (show_profiler_max + 1);
|
show_profiler = (show_profiler + 1) % (show_profiler_max + 1);
|
||||||
|
@ -1249,28 +1226,22 @@ void the_game(
|
||||||
show_profiler, show_profiler_max);
|
show_profiler, show_profiler_max);
|
||||||
|
|
||||||
if (show_profiler != 0) {
|
if (show_profiler != 0) {
|
||||||
char buff[512];
|
vlprintf(CN_ACTION,gettext("Profiler shown (page %d of %d)"),show_profiler,show_profiler_max);
|
||||||
snprintf(buff,512,gettext("Profiler shown (page %d of %d)"),show_profiler,show_profiler_max);
|
|
||||||
chatline_add(&chat_lines,narrow_to_wide(buff),-103.00);
|
|
||||||
}else{
|
}else{
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Profiler hidden")),-103.00);
|
vlprint(CN_ACTION,gettext("Profiler hidden"));
|
||||||
}
|
}
|
||||||
}else if (input->wasKeyDown(getKeySetting(VLKC_RANGE_PLUS))) {
|
}else if (input->wasKeyDown(getKeySetting(VLKC_RANGE_PLUS))) {
|
||||||
char buff[512];
|
|
||||||
int range = config_get_int("client.graphics.range.min");
|
int range = config_get_int("client.graphics.range.min");
|
||||||
range += 10;
|
range += 10;
|
||||||
config_set_int("client.graphics.range.min",range);
|
config_set_int("client.graphics.range.min",range);
|
||||||
snprintf(buff,512,gettext("Minimum viewing range changed to %d"),range);
|
vlprintf(CN_ACTION,gettext("Minimum viewing range changed to %d"),range);
|
||||||
chatline_add(&chat_lines,narrow_to_wide(buff),-103.00);
|
|
||||||
}else if (input->wasKeyDown(getKeySetting(VLKC_RANGE_MINUS))) {
|
}else if (input->wasKeyDown(getKeySetting(VLKC_RANGE_MINUS))) {
|
||||||
char buff[512];
|
|
||||||
int range = config_get_int("client.graphics.range.min");
|
int range = config_get_int("client.graphics.range.min");
|
||||||
range -= 10;
|
range -= 10;
|
||||||
if (range < 10)
|
if (range < 10)
|
||||||
range = 10;
|
range = 10;
|
||||||
config_set_int("client.graphics.range.min",range);
|
config_set_int("client.graphics.range.min",range);
|
||||||
snprintf(buff,512,gettext("Minimum viewing range changed to %d"),range);
|
vlprintf(CN_ACTION,gettext("Minimum viewing range changed to %d"),range);
|
||||||
chatline_add(&chat_lines,narrow_to_wide(buff),-103.00);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Item selection with mouse wheel
|
// Item selection with mouse wheel
|
||||||
|
@ -1336,10 +1307,10 @@ void the_game(
|
||||||
draw_control.range_all = !draw_control.range_all;
|
draw_control.range_all = !draw_control.range_all;
|
||||||
if (draw_control.range_all) {
|
if (draw_control.range_all) {
|
||||||
infostream<<"Enabled full viewing range"<<std::endl;
|
infostream<<"Enabled full viewing range"<<std::endl;
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Enabled full viewing range")),-103.00);
|
vlprint(CN_ACTION,gettext("Enabled full viewing range"));
|
||||||
}else{
|
}else{
|
||||||
infostream<<"Disabled full viewing range"<<std::endl;
|
infostream<<"Disabled full viewing range"<<std::endl;
|
||||||
chatline_add(&chat_lines,narrow_to_wide(gettext("Disabled full viewing range")),-103.00);
|
vlprint(CN_ACTION,gettext("Disabled full viewing range"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2010,68 +1981,9 @@ void the_game(
|
||||||
guitext_info->setVisible(false);
|
guitext_info->setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
if (ui_console_step(dtime)) {
|
||||||
Get chat messages from client
|
std::wstring chattext = narrow_to_wide(ui_console_get());
|
||||||
*/
|
guitext_chat->setText(chattext.c_str());
|
||||||
{
|
|
||||||
std::wstring message;
|
|
||||||
/* get new messages */
|
|
||||||
while (client.getChatMessage(message)) {
|
|
||||||
chatline_add(&chat_lines,message,0.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (chat_lines) {
|
|
||||||
ref_t *ref;
|
|
||||||
ref_t *refn;
|
|
||||||
ChatLine *line;
|
|
||||||
std::wstring whole;
|
|
||||||
s16 line_number = 0;
|
|
||||||
|
|
||||||
/* first, remove old status messages */
|
|
||||||
ref = chat_lines;
|
|
||||||
while (ref) {
|
|
||||||
line = (ChatLine*)ref->ref;
|
|
||||||
if (line->age < -50) {
|
|
||||||
line->age += dtime;
|
|
||||||
if (line->age > -100.0) {
|
|
||||||
refn = ref;
|
|
||||||
ref = ref->next;
|
|
||||||
chat_lines = (ref_t*)list_remove(&chat_lines,refn);
|
|
||||||
delete line;
|
|
||||||
free(refn);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
line_number++;
|
|
||||||
}
|
|
||||||
ref = ref->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* second, remove old and excess chat messages */
|
|
||||||
ref = chat_lines;
|
|
||||||
while (ref) {
|
|
||||||
line = (ChatLine*)ref->ref;
|
|
||||||
if (line->age > -50) {
|
|
||||||
line_number--;
|
|
||||||
line->age += dtime;
|
|
||||||
float allowed_age = (6-line_number) * 60.0;
|
|
||||||
|
|
||||||
if (line->age > allowed_age) {
|
|
||||||
refn = ref;
|
|
||||||
ref = ref->next;
|
|
||||||
chat_lines = (ref_t*)list_remove(&chat_lines,refn);
|
|
||||||
delete line;
|
|
||||||
free(refn);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
whole += line->text + L'\n';
|
|
||||||
ref = ref->next;
|
|
||||||
}
|
|
||||||
guitext_chat->setText(whole.c_str());
|
|
||||||
|
|
||||||
// Update gui element size and position
|
|
||||||
|
|
||||||
s32 chat_y = 5+(2*text_height);
|
s32 chat_y = 5+(2*text_height);
|
||||||
core::rect<s32> rect(
|
core::rect<s32> rect(
|
||||||
10,
|
10,
|
||||||
|
@ -2079,13 +1991,19 @@ void the_game(
|
||||||
screensize.X - 10,
|
screensize.X - 10,
|
||||||
chat_y + guitext_chat->getTextHeight()
|
chat_y + guitext_chat->getTextHeight()
|
||||||
);
|
);
|
||||||
|
|
||||||
guitext_chat->setRelativePosition(rect);
|
guitext_chat->setRelativePosition(rect);
|
||||||
|
|
||||||
// Don't show chat if empty or profiler or debug is enabled
|
// Don't show chat if empty or profiler or debug is enabled
|
||||||
guitext_chat->setVisible(chat_lines != NULL && show_chat && show_profiler == 0);
|
guitext_chat->setVisible(show_chat && show_profiler == 0);
|
||||||
}else{
|
}else{
|
||||||
guitext_chat->setVisible(false);
|
s32 chat_y = 5+(2*text_height);
|
||||||
|
core::rect<s32> rect(
|
||||||
|
10,
|
||||||
|
chat_y,
|
||||||
|
screensize.X - 10,
|
||||||
|
chat_y + guitext_chat->getTextHeight()
|
||||||
|
);
|
||||||
|
guitext_chat->setRelativePosition(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2353,6 +2271,7 @@ void the_game(
|
||||||
clouds->drop();
|
clouds->drop();
|
||||||
|
|
||||||
clear_particles();
|
clear_particles();
|
||||||
|
ui_console_clear();
|
||||||
|
|
||||||
bridge_register_client(NULL);
|
bridge_register_client(NULL);
|
||||||
|
|
||||||
|
|
19
src/log.c
19
src/log.c
|
@ -127,27 +127,29 @@ void vlprint(uint8_t type, char* str)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 1:
|
case CN_ERROR:
|
||||||
strcpy(buff,"ERROR: ");
|
strcpy(buff,"ERROR: ");
|
||||||
b += 7;
|
b += 7;
|
||||||
s -= 7;
|
s -= 7;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case CN_WARN:
|
||||||
strcpy(buff,"WARNING: ");
|
strcpy(buff,"WARNING: ");
|
||||||
b += 9;
|
b += 9;
|
||||||
s -= 9;
|
s -= 9;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case CN_ACTION:
|
||||||
strcpy(buff,"ACTION: ");
|
strcpy(buff,"ACTION: ");
|
||||||
b += 8;
|
b += 8;
|
||||||
s -= 8;
|
s -= 8;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case CN_CHAT:
|
||||||
strcpy(buff,"CHAT: ");
|
strcpy(buff,"CHAT: ");
|
||||||
b += 6;
|
b += 6;
|
||||||
s -= 6;
|
s -= 6;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case CN_INFO:
|
||||||
|
break;
|
||||||
|
case CN_DEBUG:
|
||||||
strcpy(buff,"DEBUG: ");
|
strcpy(buff,"DEBUG: ");
|
||||||
b += 7;
|
b += 7;
|
||||||
s -= 7;
|
s -= 7;
|
||||||
|
@ -162,9 +164,10 @@ void vlprint(uint8_t type, char* str)
|
||||||
if (type >= logdata.system_min_level && type <= logdata.system_max_level)
|
if (type >= logdata.system_min_level && type <= logdata.system_max_level)
|
||||||
printf("%s\n",buff);
|
printf("%s\n",buff);
|
||||||
/*sys_console_print(buff,1);*/
|
/*sys_console_print(buff,1);*/
|
||||||
/* TODO: log to game console */
|
#ifndef SERVER
|
||||||
/*if (type >= logdata.console_min_level && type <= logdata.console_max_level)
|
if (type >= logdata.console_min_level && type <= logdata.console_max_level)
|
||||||
console_put(buff);*/
|
ui_console_addline(type,str);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (type < logdata.min_level || type > logdata.max_level)
|
if (type < logdata.min_level || type > logdata.max_level)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -0,0 +1,213 @@
|
||||||
|
/************************************************************************
|
||||||
|
* ui_console.c
|
||||||
|
* voxelands - 3d voxel world sandbox game
|
||||||
|
* Copyright (C) Lisa 'darkrose' Milne 2017 <lisa@ltmnet.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "list.h"
|
||||||
|
#include "thread.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
typedef struct chatline_s {
|
||||||
|
struct chatline_s *prev;
|
||||||
|
struct chatline_s *next;
|
||||||
|
uint8_t type;
|
||||||
|
float age;
|
||||||
|
char buff[1024];
|
||||||
|
} chatline_t;
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
chatline_t *lines;
|
||||||
|
mutex_t *mutex;
|
||||||
|
int count;
|
||||||
|
int changed;
|
||||||
|
char buff[10240];
|
||||||
|
} ui_console_data = {
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
};
|
||||||
|
|
||||||
|
void ui_console_addline(uint8_t type, char* txt)
|
||||||
|
{
|
||||||
|
chatline_t *l;
|
||||||
|
chatline_t *p;
|
||||||
|
char* b;
|
||||||
|
int s = 1024;
|
||||||
|
|
||||||
|
if (!txt || !txt[0])
|
||||||
|
return;
|
||||||
|
|
||||||
|
l = malloc(sizeof(chatline_t));
|
||||||
|
if (!l)
|
||||||
|
return;
|
||||||
|
|
||||||
|
l->type = type;
|
||||||
|
b = l->buff;
|
||||||
|
l->age = 0.0;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case CN_ERROR:
|
||||||
|
strcpy(l->buff,"ERROR: ");
|
||||||
|
b += 7;
|
||||||
|
s -= 7;
|
||||||
|
break;
|
||||||
|
case CN_WARN:
|
||||||
|
strcpy(l->buff,"WARNING: ");
|
||||||
|
b += 9;
|
||||||
|
s -= 9;
|
||||||
|
break;
|
||||||
|
case CN_ACTION:
|
||||||
|
strcpy(l->buff,"ACTION: ");
|
||||||
|
b += 8;
|
||||||
|
s -= 8;
|
||||||
|
break;
|
||||||
|
case CN_CHAT:
|
||||||
|
case CN_INFO:
|
||||||
|
break;
|
||||||
|
case CN_DEBUG:
|
||||||
|
strcpy(l->buff,"DEBUG: ");
|
||||||
|
b += 7;
|
||||||
|
s -= 7;
|
||||||
|
break;
|
||||||
|
default:;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (snprintf(b,s,"%s",txt) >= s)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!ui_console_data.mutex)
|
||||||
|
ui_console_data.mutex = mutex_create();
|
||||||
|
|
||||||
|
mutex_lock(ui_console_data.mutex);
|
||||||
|
|
||||||
|
printf("CHATLINE: '%s'\n",l->buff);
|
||||||
|
|
||||||
|
p = list_last(&ui_console_data.lines);
|
||||||
|
if (p && p->type == l->type && !strcmp(p->buff,l->buff)) {
|
||||||
|
p->age = 0.0;
|
||||||
|
free(l);
|
||||||
|
}else{
|
||||||
|
ui_console_data.lines = list_push(&ui_console_data.lines,l);
|
||||||
|
ui_console_data.changed = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_unlock(ui_console_data.mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ui_console_addlinef(uint8_t type, char* fmt, ...)
|
||||||
|
{
|
||||||
|
char buff[1024];
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
if (!fmt || !fmt[0])
|
||||||
|
return;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
if (vsnprintf(buff, 1024, fmt, ap) >= 1024) {
|
||||||
|
va_end(ap);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ui_console_clear()
|
||||||
|
{
|
||||||
|
chatline_t *l;
|
||||||
|
if (!ui_console_data.mutex)
|
||||||
|
return;
|
||||||
|
mutex_lock(ui_console_data.mutex);
|
||||||
|
while ((l = list_pop(&ui_console_data.lines)) != NULL) {
|
||||||
|
free(l);
|
||||||
|
}
|
||||||
|
mutex_unlock(ui_console_data.mutex);
|
||||||
|
mutex_free(ui_console_data.mutex);
|
||||||
|
|
||||||
|
ui_console_data.mutex = NULL;
|
||||||
|
ui_console_data.count = 0;
|
||||||
|
ui_console_data.changed = 1;
|
||||||
|
ui_console_data.buff[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ui_console_step(float dtime)
|
||||||
|
{
|
||||||
|
chatline_t *line;
|
||||||
|
chatline_t *rem;
|
||||||
|
int changed = ui_console_data.changed;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
if (!ui_console_data.mutex)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
mutex_lock(ui_console_data.mutex);
|
||||||
|
line = ui_console_data.lines;
|
||||||
|
while (line) {
|
||||||
|
if (line->age > 60.0) {
|
||||||
|
changed = 1;
|
||||||
|
rem = line;
|
||||||
|
line = line->next;
|
||||||
|
ui_console_data.lines = list_remove(&ui_console_data.lines,rem);
|
||||||
|
free(rem);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
line = line->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (count > 5 && ui_console_data.lines) {
|
||||||
|
changed = 1;
|
||||||
|
rem = list_pull(&ui_console_data.lines);
|
||||||
|
free(rem);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (changed) {
|
||||||
|
int s = 10239;
|
||||||
|
int l;
|
||||||
|
char* b = ui_console_data.buff;
|
||||||
|
line = ui_console_data.lines;
|
||||||
|
while (line && s > 0) {
|
||||||
|
l = strlen(line->buff);
|
||||||
|
if (snprintf(b,s,"%s\n",line->buff) < s) {
|
||||||
|
l++;
|
||||||
|
b += l;
|
||||||
|
s -= l;
|
||||||
|
}
|
||||||
|
line = line->next;
|
||||||
|
}
|
||||||
|
*b = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui_console_data.changed = 0;
|
||||||
|
mutex_unlock(ui_console_data.mutex);
|
||||||
|
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: this, but it's a C++ bridge, so not really */
|
||||||
|
char* ui_console_get()
|
||||||
|
{
|
||||||
|
if (!ui_console_data.mutex)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
mutex_lock(ui_console_data.mutex);
|
||||||
|
return ui_console_data.buff;
|
||||||
|
mutex_unlock(ui_console_data.mutex);
|
||||||
|
}
|
Loading…
Reference in New Issue