Fix crashing when going back to main menu in launcher, fix error in chat from missing plugins directory

This commit is contained in:
UnknownShadow200 2018-12-22 22:15:38 +11:00
parent 3aea8a5b1c
commit 48fce2f25f
13 changed files with 81 additions and 26 deletions

View File

@ -1095,11 +1095,11 @@ static ReturnCode Zip_ReadLocalFileHeader(struct ZipState* state, struct ZipEntr
if (method == 0) { if (method == 0) {
Stream_ReadonlyPortion(&portion, stream, uncompressedSize); Stream_ReadonlyPortion(&portion, stream, uncompressedSize);
return state->ProcessEntry(&path, &portion, state->Obj); return state->ProcessEntry(&path, &portion, state);
} else if (method == 8) { } else if (method == 8) {
Stream_ReadonlyPortion(&portion, stream, compressedSize); Stream_ReadonlyPortion(&portion, stream, compressedSize);
Inflate_MakeStream(&compStream, &inflate, &portion); Inflate_MakeStream(&compStream, &inflate, &portion);
return state->ProcessEntry(&path, &compStream, state->Obj); return state->ProcessEntry(&path, &compStream, state);
} else { } else {
Platform_Log1("Unsupported.zip entry compression method: %i", &method); Platform_Log1("Unsupported.zip entry compression method: %i", &method);
/* TODO: Should this be an error */ /* TODO: Should this be an error */
@ -1155,7 +1155,7 @@ enum ZipSig {
ZIP_SIG_LOCALFILEHEADER = 0x04034b50 ZIP_SIG_LOCALFILEHEADER = 0x04034b50
}; };
static ReturnCode Zip_DefaultProcessor(const String* path, struct Stream* data, void* obj) { return 0; } static ReturnCode Zip_DefaultProcessor(const String* path, struct Stream* data, struct ZipState* s) { return 0; }
static bool Zip_DefaultSelector(const String* path) { return true; } static bool Zip_DefaultSelector(const String* path) { return true; }
void Zip_Init(struct ZipState* state, struct Stream* input) { void Zip_Init(struct ZipState* state, struct Stream* input) {
state->Input = input; state->Input = input;

View File

@ -112,6 +112,7 @@ CC_API void ZLib_MakeStream(struct Stream* stream, struct ZLibState* state, stru
/* Minimal data needed to describe an entry in a .zip archive. */ /* Minimal data needed to describe an entry in a .zip archive. */
struct ZipEntry { uint32_t CompressedSize, UncompressedSize, LocalHeaderOffset; }; struct ZipEntry { uint32_t CompressedSize, UncompressedSize, LocalHeaderOffset; };
#define ZIP_MAX_ENTRIES 2048 #define ZIP_MAX_ENTRIES 2048
struct ZipState;
/* Stores state for reading and processing entries in a .zip archive. */ /* Stores state for reading and processing entries in a .zip archive. */
struct ZipState { struct ZipState {
@ -121,11 +122,11 @@ struct ZipState {
/* obj is user specified in state.Obj variable */ /* obj is user specified in state.Obj variable */
/* Return non-zero to indicate an error and stop further processing. */ /* Return non-zero to indicate an error and stop further processing. */
/* NOTE: data stream MAY NOT be seekable. (i.e. entry data might be compressed) */ /* NOTE: data stream MAY NOT be seekable. (i.e. entry data might be compressed) */
ReturnCode (*ProcessEntry)(const String* path, struct Stream* data, void* obj); ReturnCode (*ProcessEntry)(const String* path, struct Stream* data, struct ZipState* state);
/* Predicate used to select which entries in a .zip archive get processed. */ /* Predicate used to select which entries in a .zip archive get processed. */
/* NOTE: returning false entirely skips the entry. (avoids pointless seek to entry) */ /* NOTE: returning false entirely skips the entry. (avoids pointless seek to entry) */
bool (*SelectEntry)(const String* path); bool (*SelectEntry)(const String* path);
/* Generic object/pointer passed to ProcessEntry callback. */ /* Generic object/pointer for ProcessEntry callback. */
void* Obj; void* Obj;
/* (internal) Number of entries selected by SelectEntry. */ /* (internal) Number of entries selected by SelectEntry. */

View File

@ -14,7 +14,7 @@ extern struct IGameComponent Drawer2D_Component;
void DrawTextArgs_Make(struct DrawTextArgs* args, STRING_REF const String* text, const FontDesc* font, bool useShadow); void DrawTextArgs_Make(struct DrawTextArgs* args, STRING_REF const String* text, const FontDesc* font, bool useShadow);
void DrawTextArgs_MakeEmpty(struct DrawTextArgs* args, const FontDesc* font, bool useShadow); void DrawTextArgs_MakeEmpty(struct DrawTextArgs* args, const FontDesc* font, bool useShadow);
/* Initialises the given font. When Drawer2D_BitmappedText is false, makes native font handle. */ /* Initialises the given font. When Drawer2D_BitmappedText is false, creates native font handle using Font_Make. */
CC_NOINLINE void Drawer2D_MakeFont(FontDesc* desc, int size, int style); CC_NOINLINE void Drawer2D_MakeFont(FontDesc* desc, int size, int style);
/* Whether text should be drawn and measured using the currently set font bitmap. */ /* Whether text should be drawn and measured using the currently set font bitmap. */

View File

@ -1133,11 +1133,14 @@ static void ServersScreen_Refresh(void* w, int x, int y) {
LWidget_Redraw(btn); LWidget_Redraw(btn);
} }
static void ServersScreen_Init(struct LScreen* s_) { static void ServersScreen_SearchChanged(struct LInput* w) {
struct ServersScreen* s = (struct ServersScreen*)s_; struct ServersScreen* s = &ServersScreen_Instance;
LTable_Filter(&s->Table, &w->Text);
LWidget_Draw(&s->Table);
}
Font_Make(&s->RowFont, &Drawer2D_FontName, 11, FONT_STYLE_NORMAL); static void ServersScreen_InitWidgets(struct LScreen* s_) {
if (s->NumWidgets) return; struct ServersScreen* s = (struct ServersScreen*)s_;
s->Widgets = s->_widgets; s->Widgets = s->_widgets;
LScreen_Input(s_, &s->IptName, 370, false, "&gSearch servers.."); LScreen_Input(s_, &s->IptName, 370, false, "&gSearch servers..");
@ -1151,10 +1154,25 @@ static void ServersScreen_Init(struct LScreen* s_) {
s->BtnConnect.OnClick = ServersScreen_Connect; s->BtnConnect.OnClick = ServersScreen_Connect;
s->BtnRefresh.OnClick = ServersScreen_Refresh; s->BtnRefresh.OnClick = ServersScreen_Refresh;
s->IptName.TextChanged = ServersScreen_SearchChanged;
LTable_Init(&s->Table, &Launcher_TextFont, &s->RowFont); LTable_Init(&s->Table, &Launcher_TextFont, &s->RowFont);
s->Widgets[s->NumWidgets++] = (struct LWidget*)&s->Table; s->Widgets[s->NumWidgets++] = (struct LWidget*)&s->Table;
} }
static void ServersScreen_Init(struct LScreen* s_) {
struct ServersScreen* s = (struct ServersScreen*)s_;
Drawer2D_MakeFont(&s->RowFont, 11, FONT_STYLE_NORMAL);
if (!s->NumWidgets) ServersScreen_InitWidgets(s_);
s->Table.RowFont = s->RowFont;
s->IptHash.Text.length = 0;
s->IptName.Text.length = 0;
LTable_Filter(&s->Table, &s->IptHash.Text);
LScreen_SelectWidget(s_, (struct LWidget*)&s->IptName, false);
}
static void ServersScreen_Free(struct LScreen* s_) { static void ServersScreen_Free(struct LScreen* s_) {
struct ServersScreen* s = (struct ServersScreen*)s_; struct ServersScreen* s = (struct ServersScreen*)s_;
Font_Free(&s->RowFont); Font_Free(&s->RowFont);

View File

@ -1,5 +1,5 @@
#include "Launcher.h"
#include "LWeb.h" #include "LWeb.h"
#include "Launcher.h"
#include "Platform.h" #include "Platform.h"
#include "Stream.h" #include "Stream.h"
@ -306,6 +306,7 @@ static void ServerInfo_Init(struct ServerInfo* info) {
info->MaxPlayers = 0; info->MaxPlayers = 0;
info->Uptime = 0; info->Uptime = 0;
info->Featured = false; info->Featured = false;
info->_order = -100000;
} }
static void ServerInfo_Parse(struct JsonContext* ctx, const String* val) { static void ServerInfo_Parse(struct JsonContext* ctx, const String* val) {
@ -371,10 +372,13 @@ static void FetchServersTask_Next(struct JsonContext* ctx) {
} }
static void FetchServersTask_Handle(uint8_t* data, uint32_t len) { static void FetchServersTask_Handle(uint8_t* data, uint32_t len) {
/* -1 because servers is surrounded by a { */
FetchServersTask.NumServers = -1;
Json_Handle(data, len, NULL, NULL, FetchServersTask_Count); Json_Handle(data, len, NULL, NULL, FetchServersTask_Count);
if (!FetchServersTask.NumServers) return;
if (FetchServersTask.NumServers <= 0) return;
FetchServersTask.Servers = Mem_Alloc(FetchServersTask.NumServers, sizeof(struct ServerInfo), "servers list"); FetchServersTask.Servers = Mem_Alloc(FetchServersTask.NumServers, sizeof(struct ServerInfo), "servers list");
/* -2 because servers is surrounded by a { */ /* -2 because servers is surrounded by a { */
curServer = FetchServersTask.Servers - 2; curServer = FetchServersTask.Servers - 2;
Json_Handle(data, len, ServerInfo_Parse, NULL, FetchServersTask_Next); Json_Handle(data, len, ServerInfo_Parse, NULL, FetchServersTask_Next);

View File

@ -35,6 +35,7 @@ struct ServerInfo {
int Players, MaxPlayers, Port, Uptime; int Players, MaxPlayers, Port, Uptime;
bool Featured; bool Featured;
char _Buffer[6][STRING_SIZE]; char _Buffer[6][STRING_SIZE];
int _order; /* (internal) order in servers table */
}; };
struct LWebTask; struct LWebTask;

View File

@ -668,6 +668,7 @@ static struct LTableColumn tableColumns[4] = {
#define CELL_XPADDING 3 #define CELL_XPADDING 3
#define LTable_Get(row) &FetchServersTask.Servers[FetchServersTask.Servers[row]._order]
void LTable_DrawHeaders(struct LTable* w) { void LTable_DrawHeaders(struct LTable* w) {
BitmapCol gridCol = BITMAPCOL_CONST(20, 20, 10, 255); BitmapCol gridCol = BITMAPCOL_CONST(20, 20, 10, 255);
struct DrawTextArgs args; struct DrawTextArgs args;
@ -697,6 +698,7 @@ void LTable_DrawHeaders(struct LTable* w) {
void LTable_DrawRows(struct LTable* w) { void LTable_DrawRows(struct LTable* w) {
BitmapCol gridCol = BITMAPCOL_CONST(20, 20, 10, 255); BitmapCol gridCol = BITMAPCOL_CONST(20, 20, 10, 255);
String str; char strBuffer[STRING_SIZE]; String str; char strBuffer[STRING_SIZE];
struct ServerInfo* entry;
struct DrawTextArgs args; struct DrawTextArgs args;
int i, x, y, row; int i, x, y, row;
@ -711,12 +713,14 @@ void LTable_DrawRows(struct LTable* w) {
Drawer2D_Clear(&Launcher_Framebuffer, gridCol, Drawer2D_Clear(&Launcher_Framebuffer, gridCol,
x, y, w->Width, w->RowHeight); x, y, w->Width, w->RowHeight);
} }
if (row >= FetchServersTask.NumServers) continue; /* TODO: w->Count instead */
if (row >= w->RowsCount) continue;
entry = LTable_Get(row);
for (i = 0; i < w->NumColumns; i++) { for (i = 0; i < w->NumColumns; i++) {
x += CELL_XPADDING; x += CELL_XPADDING;
args.Text.length = 0; args.Text.length = 0;
w->Columns[i].GetValue(&FetchServersTask.Servers[row], &args.Text); w->Columns[i].GetValue(entry, &args.Text);
Drawer2D_DrawClippedText(&Launcher_Framebuffer, &args, Drawer2D_DrawClippedText(&Launcher_Framebuffer, &args,
x, y, w->Columns[i].Width); x, y, w->Columns[i].Width);
@ -1083,3 +1087,21 @@ void LTable_Init(struct LTable* w, const FontDesc* hdrFont, const FontDesc* rowF
LTable_StopDragging(w); LTable_StopDragging(w);
LTable_Reposition(w); LTable_Reposition(w);
} }
void LTable_Filter(struct LTable* w, const String* filter) {
int i, j, count;
count = FetchServersTask.NumServers;
for (i = 0, j = 0; i < count; i++) {
if (String_CaselessContains(&FetchServersTask.Servers[i].Name, filter)) {
FetchServersTask.Servers[j++]._order = i;
}
}
w->RowsCount = j;
for (; j < count; j++) {
FetchServersTask.Servers[j]._order = -100000;
}
/* TODO: preserve selected server */
/* TODO: Resort entries again */
}

View File

@ -137,8 +137,10 @@ struct LTable {
int RowsBegY, RowHeight; int RowsBegY, RowHeight;
/* Y height of headers. */ /* Y height of headers. */
int HdrHeight; int HdrHeight;
/* Number of rows currently visible. */ /* Maximum number of rows visible. */
int VisibleRows; int VisibleRows;
/* Total number of rows in the table (after filter is applied). */
int RowsCount;
/* Index of column currently being dragged. */ /* Index of column currently being dragged. */
int DraggingColumn; int DraggingColumn;
@ -149,4 +151,10 @@ struct LTable {
void LTable_Init(struct LTable* table, const FontDesc* hdrFont, const FontDesc* rowFont); void LTable_Init(struct LTable* table, const FontDesc* hdrFont, const FontDesc* rowFont);
CC_NOINLINE void LTable_StopDragging(struct LTable* table); CC_NOINLINE void LTable_StopDragging(struct LTable* table);
void LTable_Reposition(struct LTable* table); void LTable_Reposition(struct LTable* table);
/* Filters rows to only show those containing 'filter' in the name. */
void LTable_Filter(struct LTable* table, const String* filter);
/* Attempts to select the row whose hash equals the given hash. Scrolls table if needed. */
void LTable_SetSelected(struct LTable* table, const String* hash);
/* Attempts to get the hash of the currently selected row. */
void LTable_GetSelected(struct LTable* table, String* hash);
#endif #endif

View File

@ -197,10 +197,10 @@ static void Launcher_Init(void) {
Event_RegisterMouseMove(&MouseEvents_Moved, NULL, Launcher_MouseMove); Event_RegisterMouseMove(&MouseEvents_Moved, NULL, Launcher_MouseMove);
Event_RegisterFloat(&MouseEvents_Wheel, NULL, Launcher_MouseWheel); Event_RegisterFloat(&MouseEvents_Wheel, NULL, Launcher_MouseWheel);
Font_Make(&logoFont, &Drawer2D_FontName, 32, FONT_STYLE_NORMAL); Drawer2D_MakeFont(&logoFont, 32, FONT_STYLE_NORMAL);
Font_Make(&Launcher_TitleFont, &Drawer2D_FontName, 16, FONT_STYLE_BOLD); Drawer2D_MakeFont(&Launcher_TitleFont, 16, FONT_STYLE_BOLD);
Font_Make(&Launcher_TextFont, &Drawer2D_FontName, 14, FONT_STYLE_NORMAL); Drawer2D_MakeFont(&Launcher_TextFont, 14, FONT_STYLE_NORMAL);
Font_Make(&Launcher_HintFont, &Drawer2D_FontName, 12, FONT_STYLE_ITALIC); Drawer2D_MakeFont(&Launcher_HintFont, 12, FONT_STYLE_ITALIC);
Drawer2D_Cols['g'] = col; Drawer2D_Cols['g'] = col;
Utils_EnsureDirectory("texpacks"); Utils_EnsureDirectory("texpacks");
@ -377,7 +377,7 @@ static void Launcher_LoadTextures(Bitmap* bmp) {
0, 0, TILESIZE, TILESIZE); 0, 0, TILESIZE, TILESIZE);
} }
static ReturnCode Launcher_ProcessZipEntry(const String* path, struct Stream* data, void* obj) { static ReturnCode Launcher_ProcessZipEntry(const String* path, struct Stream* data, struct ZipState* s) {
Bitmap bmp; Bitmap bmp;
ReturnCode res; ReturnCode res;

View File

@ -184,7 +184,7 @@ CC_API void Waitable_Wait(void* handle);
CC_API void Waitable_WaitFor(void* handle, uint32_t milliseconds); CC_API void Waitable_WaitFor(void* handle, uint32_t milliseconds);
/* Gets the list of all supported font names on this platform. */ /* Gets the list of all supported font names on this platform. */
CC_API void Font_GetNames(StringsBuffer* buffer); void Font_GetNames(StringsBuffer* buffer);
/* Finds the path of the given font, with closest matching style */ /* Finds the path of the given font, with closest matching style */
String Font_Lookup(const String* fontName, int style); String Font_Lookup(const String* fontName, int style);
/* Allocates a new font from the given arguments. */ /* Allocates a new font from the given arguments. */

View File

@ -88,6 +88,7 @@ int main(int argc, char** argv) {
Utils_EnsureDirectory("maps"); Utils_EnsureDirectory("maps");
Utils_EnsureDirectory("texpacks"); Utils_EnsureDirectory("texpacks");
Utils_EnsureDirectory("texturecache"); Utils_EnsureDirectory("texturecache");
Utils_EnsureDirectory("plugins");
Options_Load(); Options_Load();
if (argsCount == 0) { if (argsCount == 0) {

View File

@ -364,9 +364,9 @@ static bool ClassicPatcher_SelectEntry(const String* path ) {
return Resources_FindTex(&name) != NULL; return Resources_FindTex(&name) != NULL;
} }
static ReturnCode ClassicPatcher_ProcessEntry(const String* path, struct Stream* data, void* obj) { static ReturnCode ClassicPatcher_ProcessEntry(const String* path, struct Stream* data, struct ZipState* state) {
static const String guiClassicPng = String_FromConst("gui_classic.png"); static const String guiClassicPng = String_FromConst("gui_classic.png");
struct Stream* s = obj; struct Stream* s = state->Obj;
struct ResourceTexture* entry; struct ResourceTexture* entry;
String name; String name;
@ -465,8 +465,8 @@ static ReturnCode ModernPatcher_MakeAnimations(struct Stream* s, struct Stream*
return ZipPatcher_WritePng(s, entry, &anim); return ZipPatcher_WritePng(s, entry, &anim);
} }
static ReturnCode ModernPatcher_ProcessEntry(const String* path, struct Stream* data, void* obj) { static ReturnCode ModernPatcher_ProcessEntry(const String* path, struct Stream* data, struct ZipState* state) {
struct Stream* s = obj; struct Stream* s = state->Obj;
struct ResourceTexture* entry; struct ResourceTexture* entry;
struct TilePatch* tile; struct TilePatch* tile;
String name; String name;

View File

@ -621,7 +621,7 @@ void TextureCache_SetLastModified(const String* url, const TimeMS* lastModified)
/*########################################################################################################################* /*########################################################################################################################*
*-------------------------------------------------------TexturePack-------------------------------------------------------* *-------------------------------------------------------TexturePack-------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
static ReturnCode TexturePack_ProcessZipEntry(const String* path, struct Stream* stream, void* obj) { static ReturnCode TexturePack_ProcessZipEntry(const String* path, struct Stream* stream, struct ZipState* s) {
String name = *path; String name = *path;
Utils_UNSAFE_GetFilename(&name); Utils_UNSAFE_GetFilename(&name);
Event_RaiseEntry(&TextureEvents_FileChanged, stream, &name); Event_RaiseEntry(&TextureEvents_FileChanged, stream, &name);