Onscreen buttons work now.. technically

This commit is contained in:
UnknownShadow200 2020-11-13 21:52:33 +11:00
parent 531a4ad34d
commit eb9b0aad28

View File

@ -1893,40 +1893,60 @@ void DisconnectScreen_Show(const cc_string* title, const cc_string* message) {
*--------------------------------------------------------TouchScreen------------------------------------------------------* *--------------------------------------------------------TouchScreen------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
#ifdef CC_BUILD_TOUCH #ifdef CC_BUILD_TOUCH
#define TOUCH_MAX_BTNS 3 #define TOUCH_MAX_BTNS (ONSCREEN_MAX_BTNS + 3)
struct TouchBindDesc { struct TouchButtonDesc {
const char* text; const char* text;
cc_uint8 bind, width; cc_uint8 bind, width;
cc_int16 x, y; cc_int16 x, y;
Widget_LeftClick OnClick; Widget_LeftClick OnClick;
cc_bool* enabled;
}; };
static struct TouchScreen { static struct TouchScreen {
Screen_Body Screen_Body
const struct TouchBindDesc* descs; const struct TouchButtonDesc* descs;
int numDescs; int numOnscreen, numBtns;
struct FontDesc font; struct FontDesc font;
struct ThumbstickWidget thumbstick; struct ThumbstickWidget thumbstick;
struct ButtonWidget btns[TOUCH_MAX_BTNS]; const struct TouchButtonDesc* onscreenDescs[ONSCREEN_MAX_BTNS];
struct ButtonWidget onscreen[ONSCREEN_MAX_BTNS];
struct ButtonWidget btns[3];
} TouchScreen; } TouchScreen;
static struct Widget* touch_widgets[1 + TOUCH_MAX_BTNS] = { static struct Widget* touch_widgets[1 + TOUCH_MAX_BTNS] = {
NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,
NULL,NULL,NULL, (struct Widget*)&TouchScreen.thumbstick NULL,NULL,NULL, (struct Widget*)&TouchScreen.thumbstick
}; };
#define TOUCH_MAX_VERTICES (THUMBSTICKWIDGET_MAX + TOUCH_MAX_BTNS * BUTTONWIDGET_MAX) #define TOUCH_MAX_VERTICES (THUMBSTICKWIDGET_MAX + TOUCH_MAX_BTNS * BUTTONWIDGET_MAX)
static void TouchScreen_OnscreenClick(void* screen, void* widget) {
struct TouchScreen* s = (struct TouchScreen*)screen;
int i = Screen_Index(screen, widget);
Input_SetPressed(KeyBinds[s->onscreenDescs[i]->bind], true);
}
static void TouchScreen_MoreClick(void* s, void* w) { TouchMoreScreen_Show(); } static void TouchScreen_MoreClick(void* s, void* w) { TouchMoreScreen_Show(); }
static void TouchScreen_BindClick(void* screen, void* widget) { static void TouchScreen_BindClick(void* screen, void* widget) {
struct TouchScreen* s = (struct TouchScreen*)screen; struct TouchScreen* s = (struct TouchScreen*)screen;
int i = Screen_Index(screen, widget); int i = Screen_Index(screen, widget) - ONSCREEN_MAX_BTNS;
Input_SetPressed(KeyBinds[s->descs[i].bind], true); Input_SetPressed(KeyBinds[s->descs[i].bind], true);
} }
static const struct TouchBindDesc normDescs[2] = { static const struct TouchButtonDesc onscreenDescs[8] = {
{ "Chat", KEYBIND_CHAT, 0,0,0, TouchScreen_OnscreenClick },
{ "List", KEYBIND_PLAYER_LIST, 0,0,0, TouchScreen_OnscreenClick },
{ "Respawn", KEYBIND_RESPAWN, 0,0,0, TouchScreen_OnscreenClick },
{ "Set spawn", KEYBIND_SET_SPAWN, 0,0,0, TouchScreen_OnscreenClick },
{ "Fly", KEYBIND_FLY, 0,0,0, TouchScreen_OnscreenClick },
{ "Noclip", KEYBIND_NOCLIP, 0,0,0, TouchScreen_OnscreenClick },
{ "Speed", KEYBIND_SPEED, 0,0,0, TouchScreen_OnscreenClick },
{ "\xabSpeed", KEYBIND_HALF_SPEED, 0,0,0, TouchScreen_OnscreenClick }
};
static const struct TouchButtonDesc normDescs[2] = {
{ "More", KEYBIND_COUNT, 100, 50, 90, TouchScreen_MoreClick }, { "More", KEYBIND_COUNT, 100, 50, 90, TouchScreen_MoreClick },
{ "Jump", KEYBIND_JUMP, 100, 50, 10, TouchScreen_BindClick } { "Jump", KEYBIND_JUMP, 100, 50, 10, TouchScreen_BindClick }
}; };
static const struct TouchBindDesc hackDescs[3] = { static const struct TouchButtonDesc hackDescs[3] = {
{ "More", KEYBIND_COUNT, 100, 50, 130, TouchScreen_MoreClick }, { "More", KEYBIND_COUNT, 100, 50, 130, TouchScreen_MoreClick },
{ "Up", KEYBIND_FLY_UP, 100, 50, 50, TouchScreen_BindClick }, { "Up", KEYBIND_FLY_UP, 100, 50, 50, TouchScreen_BindClick },
{ "Down", KEYBIND_FLY_DOWN, 100, 50, 10, TouchScreen_BindClick } { "Down", KEYBIND_FLY_DOWN, 100, 50, 10, TouchScreen_BindClick }
@ -1934,23 +1954,35 @@ static const struct TouchBindDesc hackDescs[3] = {
static void TouchScreen_InitButtons(struct TouchScreen* s) { static void TouchScreen_InitButtons(struct TouchScreen* s) {
struct HacksComp* hacks = &LocalPlayer_Instance.Hacks; struct HacksComp* hacks = &LocalPlayer_Instance.Hacks;
const struct TouchBindDesc* desc; const struct TouchButtonDesc* desc;
int i; int i, j;
for (; i < TOUCH_MAX_BTNS; i++) s->widgets[i] = NULL;
if (hacks->Flying || hacks->Noclip) { for (i = 0, j = 0; i < ONSCREEN_MAX_BTNS; i++) {
s->descs = hackDescs; if (!(Gui._onscreenButtons & (1 << i))) continue;
s->numDescs = Array_Elems(hackDescs); desc = &onscreenDescs[i];
} else {
s->descs = normDescs; ButtonWidget_Init(&s->onscreen[j], 100, desc->OnClick);
s->numDescs = Array_Elems(normDescs); if (desc->enabled) s->onscreen[j].disabled = !(*desc->enabled);
s->onscreenDescs[j] = desc;
s->widgets[j] = (struct Widget*)&s->onscreen[j];
j++;
} }
for (i = 0; i < s->numDescs; i++) { s->numOnscreen = j;
s->widgets[i] = (struct Widget*)&s->btns[i]; if (hacks->Flying || hacks->Noclip) {
s->descs = hackDescs;
s->numBtns = Array_Elems(hackDescs);
} else {
s->descs = normDescs;
s->numBtns = Array_Elems(normDescs);
}
for (i = 0; i < s->numBtns; i++) {
s->widgets[i + ONSCREEN_MAX_BTNS] = (struct Widget*)&s->btns[i];
desc = &s->descs[i]; desc = &s->descs[i];
ButtonWidget_Init(&s->btns[i], desc->width, desc->OnClick); ButtonWidget_Init(&s->btns[i], desc->width, desc->OnClick);
} }
for (; i < TOUCH_MAX_BTNS; i++) s->widgets[i] = NULL;
} }
static void TouchScreen_HacksChanged(void* screen) { static void TouchScreen_HacksChanged(void* screen) {
@ -1970,12 +2002,16 @@ static void TouchScreen_ContextLost(void* screen) {
static void TouchScreen_ContextRecreated(void* screen) { static void TouchScreen_ContextRecreated(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen; struct TouchScreen* s = (struct TouchScreen*)screen;
const struct TouchBindDesc* desc; const struct TouchButtonDesc* desc;
int i; int i;
Screen_CreateVb(screen); Screen_CreateVb(screen);
Drawer2D_MakeFont(&s->font, 16, FONT_FLAGS_BOLD); Drawer2D_MakeFont(&s->font, 16, FONT_FLAGS_BOLD);
for (i = 0; i < s->numDescs; i++) { for (i = 0; i < s->numOnscreen; i++) {
desc = s->onscreenDescs[i];
ButtonWidget_SetConst(&s->onscreen[i], desc->text, &s->font);
}
for (i = 0; i < s->numBtns; i++) {
desc = &s->descs[i]; desc = &s->descs[i];
ButtonWidget_SetConst(&s->btns[i], desc->text, &s->font); ButtonWidget_SetConst(&s->btns[i], desc->text, &s->font);
} }
@ -2006,7 +2042,7 @@ static int TouchScreen_PointerUp(void* screen, int id, int x, int y) {
//Chat_Add1("POINTER UP: %i", &id); //Chat_Add1("POINTER UP: %i", &id);
s->thumbstick.active &= ~id; s->thumbstick.active &= ~id;
for (i = 0; i < s->numDescs; i++) { for (i = 0; i < s->numBtns; i++) {
if (!(s->btns[i].active & id)) continue; if (!(s->btns[i].active & id)) continue;
if (s->descs[i].bind < KEYBIND_COUNT) { if (s->descs[i].bind < KEYBIND_COUNT) {
@ -2018,11 +2054,36 @@ static int TouchScreen_PointerUp(void* screen, int id, int x, int y) {
return false; return false;
} }
static void TouchScreen_Layout(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen;
const struct TouchButtonDesc* desc;
int i, height;
for (i = 0; i < s->numOnscreen; i++) {
Widget_SetLocation(&s->onscreen[i], ANCHOR_MAX, ANCHOR_MIN, 10, 10 + i * 40);
}
/* Need to align these relative to the hotbar */
HUDScreen_Layout(Gui_HUD);
height = Gui_HUD->hotbar.height;
for (i = 0; i < s->numBtns; i++) {
desc = &s->descs[i];
Widget_SetLocation(&s->btns[i], ANCHOR_MAX, ANCHOR_MAX, desc->x, desc->y);
s->btns[i].yOffset += height;
Widget_Layout(&s->btns[i]);
}
Widget_SetLocation(&s->thumbstick, ANCHOR_MIN, ANCHOR_MAX, 30, 5);
s->thumbstick.yOffset += height;
Widget_Layout(&s->thumbstick);
}
struct LocalPlayerInput touchInput;
static void TouchScreen_GetMovement(float* xMoving, float* zMoving) { static void TouchScreen_GetMovement(float* xMoving, float* zMoving) {
ThumbstickWidget_GetMovement(&TouchScreen.thumbstick, xMoving, zMoving); ThumbstickWidget_GetMovement(&TouchScreen.thumbstick, xMoving, zMoving);
} }
struct LocalPlayerInput touchInput;
static void TouchScreen_Init(void* screen) { static void TouchScreen_Init(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen; struct TouchScreen* s = (struct TouchScreen*)screen;
@ -2037,27 +2098,6 @@ static void TouchScreen_Init(void* screen) {
LocalPlayer_Instance.input.next = &touchInput; LocalPlayer_Instance.input.next = &touchInput;
} }
static void TouchScreen_Layout(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen;
const struct TouchBindDesc* desc;
int i, height;
/* Need to align these relative to the hotbar */
HUDScreen_Layout(Gui_HUD);
height = Gui_HUD->hotbar.height;
for (i = 0; i < s->numDescs; i++) {
desc = &s->descs[i];
Widget_SetLocation(&s->btns[i], ANCHOR_MAX, ANCHOR_MAX, desc->x, desc->y);
s->btns[i].yOffset += height;
Widget_Layout(&s->btns[i]);
}
Widget_SetLocation(&s->thumbstick, ANCHOR_MIN, ANCHOR_MAX, 30, 5);
s->thumbstick.yOffset += height;
Widget_Layout(&s->thumbstick);
}
static void TouchScreen_Free(void* s) { static void TouchScreen_Free(void* s) {
Event_Unregister_(&UserEvents.HacksStateChanged, s, TouchScreen_HacksChanged); Event_Unregister_(&UserEvents.HacksStateChanged, s, TouchScreen_HacksChanged);
} }