mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-11 07:12:02 +00:00
- scriptified DPlayerMenu::MenuEvent.
This commit is contained in:
parent
f4e9cd0009
commit
51493cde8c
2 changed files with 254 additions and 134 deletions
|
@ -81,7 +81,6 @@ public:
|
||||||
void PlayerNameChanged(DMenuItemBase *li);
|
void PlayerNameChanged(DMenuItemBase *li);
|
||||||
void ColorSetChanged (DMenuItemBase *li);
|
void ColorSetChanged (DMenuItemBase *li);
|
||||||
void ClassChanged (DMenuItemBase *li);
|
void ClassChanged (DMenuItemBase *li);
|
||||||
void AutoaimChanged (DMenuItemBase *li);
|
|
||||||
void SkinChanged (DMenuItemBase *li);
|
void SkinChanged (DMenuItemBase *li);
|
||||||
|
|
||||||
|
|
||||||
|
@ -90,7 +89,6 @@ public:
|
||||||
DPlayerMenu() {}
|
DPlayerMenu() {}
|
||||||
void Init(DMenu *parent, DListMenuDescriptor *desc);
|
void Init(DMenu *parent, DListMenuDescriptor *desc);
|
||||||
bool Responder (event_t *ev);
|
bool Responder (event_t *ev);
|
||||||
bool MenuEvent (int mkey, bool fromcontroller);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_CLASS(DPlayerMenu, false, false)
|
IMPLEMENT_CLASS(DPlayerMenu, false, false)
|
||||||
|
@ -403,20 +401,22 @@ void DPlayerMenu::UpdateSkins()
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
//
|
//
|
||||||
//
|
// access to the player config is done natively, so that broader access
|
||||||
|
// functions do not need to be exported.
|
||||||
//
|
//
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
void DPlayerMenu::PlayerNameChanged(DMenuItemBase *li)
|
DEFINE_ACTION_FUNCTION(DPlayerMenu, PlayerNameChanged)
|
||||||
{
|
{
|
||||||
char pp[MAXPLAYERNAME+1];
|
PARAM_SELF_PROLOGUE(DPlayerMenu);
|
||||||
const char *p;
|
PARAM_STRING(s);
|
||||||
if (li->GetString(0, pp, MAXPLAYERNAME))
|
const char *pp = s;
|
||||||
{
|
FString command("name \"");
|
||||||
FString command("name \"");
|
|
||||||
|
|
||||||
|
if (self == DMenu::CurrentMenu)
|
||||||
|
{
|
||||||
// Escape any backslashes or quotation marks before sending the name to the console.
|
// Escape any backslashes or quotation marks before sending the name to the console.
|
||||||
for (p = pp; *p != '\0'; ++p)
|
for (auto p = pp; *p != '\0'; ++p)
|
||||||
{
|
{
|
||||||
if (*p == '"' || *p == '\\')
|
if (*p == '"' || *p == '\\')
|
||||||
{
|
{
|
||||||
|
@ -425,8 +425,9 @@ void DPlayerMenu::PlayerNameChanged(DMenuItemBase *li)
|
||||||
command << *p;
|
command << *p;
|
||||||
}
|
}
|
||||||
command << '"';
|
command << '"';
|
||||||
C_DoCommand (command);
|
C_DoCommand(command);
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
@ -435,28 +436,15 @@ void DPlayerMenu::PlayerNameChanged(DMenuItemBase *li)
|
||||||
//
|
//
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
void DPlayerMenu::ColorSetChanged (DMenuItemBase *li)
|
DEFINE_ACTION_FUNCTION(DPlayerMenu, ColorSetChanged)
|
||||||
{
|
{
|
||||||
int sel;
|
PARAM_SELF_PROLOGUE(DPlayerMenu);
|
||||||
|
PARAM_INT(sel);
|
||||||
if (li->GetValue(0, &sel))
|
if (self == DMenu::CurrentMenu)
|
||||||
{
|
{
|
||||||
int mycolorset = -1;
|
players[consoleplayer].userinfo.ColorSetChanged(sel);
|
||||||
|
|
||||||
if (sel > 0) mycolorset = PlayerColorSets[sel-1];
|
|
||||||
|
|
||||||
DMenuItemBase *red = GetItem(NAME_Red);
|
|
||||||
DMenuItemBase *green = GetItem(NAME_Green);
|
|
||||||
DMenuItemBase *blue = GetItem(NAME_Blue);
|
|
||||||
|
|
||||||
// disable the sliders if a valid colorset is selected
|
|
||||||
if (red != NULL) red->Enable(mycolorset == -1);
|
|
||||||
if (green != NULL) green->Enable(mycolorset == -1);
|
|
||||||
if (blue != NULL) blue->Enable(mycolorset == -1);
|
|
||||||
|
|
||||||
players[consoleplayer].userinfo.ColorSetChanged(mycolorset);
|
|
||||||
UpdateTranslation();
|
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
@ -493,6 +481,18 @@ void DPlayerMenu::ClassChanged (DMenuItemBase *li)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFINE_ACTION_FUNCTION(DPlayerMenu, ClassChanged)
|
||||||
|
{
|
||||||
|
PARAM_SELF_PROLOGUE(DPlayerMenu);
|
||||||
|
PARAM_OBJECT(sel, DMenuItemBase);
|
||||||
|
if (self == DMenu::CurrentMenu)
|
||||||
|
{
|
||||||
|
self->ClassChanged(sel);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@ -514,7 +514,6 @@ void DPlayerMenu::SkinChanged (DMenuItemBase *li)
|
||||||
sel = PlayerSkins[sel];
|
sel = PlayerSkins[sel];
|
||||||
players[consoleplayer].userinfo.SkinNumChanged(sel);
|
players[consoleplayer].userinfo.SkinNumChanged(sel);
|
||||||
UpdateTranslation();
|
UpdateTranslation();
|
||||||
cvar_set ("skin", skins[sel].name);
|
|
||||||
|
|
||||||
li = GetItem(NAME_Playerdisplay);
|
li = GetItem(NAME_Playerdisplay);
|
||||||
if (li != NULL)
|
if (li != NULL)
|
||||||
|
@ -524,22 +523,24 @@ void DPlayerMenu::SkinChanged (DMenuItemBase *li)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//=============================================================================
|
DEFINE_ACTION_FUNCTION(DPlayerMenu, SkinChanged)
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//=============================================================================
|
|
||||||
|
|
||||||
void DPlayerMenu::AutoaimChanged (DMenuItemBase *li)
|
|
||||||
{
|
{
|
||||||
int sel;
|
PARAM_SELF_PROLOGUE(DPlayerMenu);
|
||||||
|
PARAM_OBJECT(sel, DMenuItemBase);
|
||||||
if (li->GetValue(0, &sel))
|
if (self == DMenu::CurrentMenu)
|
||||||
{
|
{
|
||||||
autoaim = (float)sel;
|
self->SkinChanged(sel);
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(DPlayerMenu, AutoaimChanged)
|
DEFINE_ACTION_FUNCTION(DPlayerMenu, AutoaimChanged)
|
||||||
{
|
{
|
||||||
PARAM_SELF_PROLOGUE(DPlayerMenu);
|
PARAM_SELF_PROLOGUE(DPlayerMenu);
|
||||||
|
@ -551,108 +552,80 @@ DEFINE_ACTION_FUNCTION(DPlayerMenu, AutoaimChanged)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
bool DPlayerMenu::MenuEvent (int mkey, bool fromcontroller)
|
DEFINE_ACTION_FUNCTION(DPlayerMenu, TeamChanged)
|
||||||
{
|
{
|
||||||
int v;
|
PARAM_SELF_PROLOGUE(DPlayerMenu);
|
||||||
if (mDesc->mSelectedItem >= 0)
|
PARAM_INT(val);
|
||||||
|
// only allow if the menu is active to prevent abuse.
|
||||||
|
if (self == DMenu::CurrentMenu)
|
||||||
{
|
{
|
||||||
DMenuItemBase *li = mDesc->mItems[mDesc->mSelectedItem];
|
team = val == 0 ? TEAM_NONE : val - 1;
|
||||||
if (li->MenuEvent(mkey, fromcontroller))
|
|
||||||
{
|
|
||||||
FName current = li->GetAction(NULL);
|
|
||||||
switch(current)
|
|
||||||
{
|
|
||||||
// item specific handling comes here
|
|
||||||
|
|
||||||
case NAME_Playerbox:
|
|
||||||
if (mkey == MKEY_Input)
|
|
||||||
{
|
|
||||||
PlayerNameChanged(li);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_Team:
|
|
||||||
if (li->GetValue(0, &v))
|
|
||||||
{
|
|
||||||
team = v==0? TEAM_NONE : v-1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_Color:
|
|
||||||
ColorSetChanged(li);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_Red:
|
|
||||||
if (li->GetValue(0, &v))
|
|
||||||
{
|
|
||||||
uint32 color = players[consoleplayer].userinfo.GetColor();
|
|
||||||
SendNewColor (v, GPART(color), BPART(color));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_Green:
|
|
||||||
if (li->GetValue(0, &v))
|
|
||||||
{
|
|
||||||
uint32 color = players[consoleplayer].userinfo.GetColor();
|
|
||||||
SendNewColor (RPART(color), v, BPART(color));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_Blue:
|
|
||||||
if (li->GetValue(0, &v))
|
|
||||||
{
|
|
||||||
uint32 color = players[consoleplayer].userinfo.GetColor();
|
|
||||||
SendNewColor (RPART(color), GPART(color), v);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_Class:
|
|
||||||
ClassChanged(li);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_Skin:
|
|
||||||
SkinChanged(li);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_Gender:
|
|
||||||
if (li->GetValue(0, &v))
|
|
||||||
{
|
|
||||||
cvar_set ("gender", v==0? "male" : v==1? "female" : "other");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_Autoaim:
|
|
||||||
AutoaimChanged(li);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_Switch:
|
|
||||||
if (li->GetValue(0, &v))
|
|
||||||
{
|
|
||||||
neverswitchonpickup = !!v;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAME_AlwaysRun:
|
|
||||||
if (li->GetValue(0, &v))
|
|
||||||
{
|
|
||||||
cl_run = !!v;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return Super::MenuEvent(mkey, fromcontroller);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
DEFINE_ACTION_FUNCTION(DPlayerMenu, GenderChanged)
|
||||||
|
{
|
||||||
|
PARAM_SELF_PROLOGUE(DPlayerMenu);
|
||||||
|
PARAM_INT(v);
|
||||||
|
// only allow if the menu is active to prevent abuse.
|
||||||
|
if (self == DMenu::CurrentMenu)
|
||||||
|
{
|
||||||
|
cvar_set("gender", v == 0 ? "male" : v == 1 ? "female" : "other");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
DEFINE_ACTION_FUNCTION(DPlayerMenu, SwitchOnPickupChanged)
|
||||||
|
{
|
||||||
|
PARAM_SELF_PROLOGUE(DPlayerMenu);
|
||||||
|
PARAM_INT(v);
|
||||||
|
// only allow if the menu is active to prevent abuse.
|
||||||
|
if (self == DMenu::CurrentMenu)
|
||||||
|
{
|
||||||
|
neverswitchonpickup = !!v;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
DEFINE_ACTION_FUNCTION(DPlayerMenu, AlwaysRunChanged)
|
||||||
|
{
|
||||||
|
PARAM_SELF_PROLOGUE(DPlayerMenu);
|
||||||
|
PARAM_INT(v);
|
||||||
|
// only allow if the menu is active to prevent abuse.
|
||||||
|
if (self == DMenu::CurrentMenu)
|
||||||
|
{
|
||||||
|
cl_run = !!v;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
DEFINE_FIELD(DPlayerMenu, mRotation)
|
DEFINE_FIELD(DPlayerMenu, mRotation)
|
||||||
DEFINE_FIELD_NAMED(DPlayerMenu, PlayerClass, mPlayerClass)
|
DEFINE_FIELD_NAMED(DPlayerMenu, PlayerClass, mPlayerClass)
|
||||||
|
DEFINE_FIELD(DPlayerMenu, PlayerColorSets)
|
||||||
|
|
|
@ -3,9 +3,20 @@ class PlayerMenu : ListMenu native
|
||||||
{
|
{
|
||||||
native int mRotation;
|
native int mRotation;
|
||||||
native PlayerClass mPlayerClass;
|
native PlayerClass mPlayerClass;
|
||||||
|
native Array<int> PlayerColorSets;
|
||||||
|
|
||||||
|
// All write function for the player config are native to prevent abuse.
|
||||||
protected native void AutoaimChanged(float val);
|
protected native void AutoaimChanged(float val);
|
||||||
|
protected native void TeamChanged(int val);
|
||||||
|
protected native void AlwaysRunChanged(int val);
|
||||||
|
protected native void GenderChanged(int val);
|
||||||
|
protected native void SwitchOnPickupChanged(int val);
|
||||||
protected native void ColorChanged(int red, int green, int blue);
|
protected native void ColorChanged(int red, int green, int blue);
|
||||||
|
protected native void ColorSetChanged(int red);
|
||||||
|
protected native void PlayerNameChanged(String name);
|
||||||
|
|
||||||
|
protected native void ClassChanged(ListMenuItem it);
|
||||||
|
protected native void SkinChanged (ListMenuItem li);
|
||||||
|
|
||||||
protected void UpdateTranslation()
|
protected void UpdateTranslation()
|
||||||
{
|
{
|
||||||
|
@ -24,6 +35,142 @@ class PlayerMenu : ListMenu native
|
||||||
//
|
//
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
|
override bool MenuEvent (int mkey, bool fromcontroller)
|
||||||
|
{
|
||||||
|
int v;
|
||||||
|
bool res;
|
||||||
|
String s;
|
||||||
|
if (mDesc.mSelectedItem >= 0)
|
||||||
|
{
|
||||||
|
let li = mDesc.mItems[mDesc.mSelectedItem];
|
||||||
|
if (li.MenuEvent(mkey, fromcontroller))
|
||||||
|
{
|
||||||
|
Name ctrl = li.GetAction();
|
||||||
|
switch(ctrl)
|
||||||
|
{
|
||||||
|
// item specific handling comes here
|
||||||
|
|
||||||
|
case 'Playerbox':
|
||||||
|
if (mkey == MKEY_Input)
|
||||||
|
{
|
||||||
|
[res, s] = li.GetString(0);
|
||||||
|
if (res) PlayerNameChanged(s);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Team':
|
||||||
|
[res, v] = li.GetValue(0);
|
||||||
|
if (res) TeamChanged(v);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Color':
|
||||||
|
[res, v] = li.GetValue(0);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
int mycolorset = -1;
|
||||||
|
|
||||||
|
if (v > 0) mycolorset = PlayerColorSets[v - 1];
|
||||||
|
|
||||||
|
let red = GetItem('Red');
|
||||||
|
let green = GetItem('Green');
|
||||||
|
let blue = GetItem('Blue');
|
||||||
|
|
||||||
|
// disable the sliders if a valid colorset is selected
|
||||||
|
if (red != NULL) red.Enable(mycolorset == -1);
|
||||||
|
if (green != NULL) green.Enable(mycolorset == -1);
|
||||||
|
if (blue != NULL) blue.Enable(mycolorset == -1);
|
||||||
|
|
||||||
|
ColorSetChanged(v - 1);
|
||||||
|
UpdateTranslation();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Red':
|
||||||
|
[res, v] = li.GetValue(0);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
Color colr = players[consoleplayer].GetColor();
|
||||||
|
SendNewColor (v, colr.g, colr.b);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Green':
|
||||||
|
[res, v] = li.GetValue(0);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
Color colr = players[consoleplayer].GetColor();
|
||||||
|
SendNewColor (colr.r, v, colr.b);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Blue':
|
||||||
|
[res, v] = li.GetValue(0);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
Color colr = players[consoleplayer].GetColor();
|
||||||
|
SendNewColor (colr.r, colr.g, v);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Class':
|
||||||
|
[res, v] = li.GetValue(0);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
ClassChanged(li);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Skin':
|
||||||
|
SkinChanged(li);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Gender':
|
||||||
|
[res, v] = li.GetValue(0);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
GenderChanged(v);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Autoaim':
|
||||||
|
[res, v] = li.GetValue(0);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
AutoaimChanged(v);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Switch':
|
||||||
|
[res, v] = li.GetValue(0);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
SwitchOnPickupChanged(v);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'AlwaysRun':
|
||||||
|
[res, v] = li.GetValue(0);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
AlwaysRunChanged(v);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Super.MenuEvent(mkey, fromcontroller);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
override bool MouseEvent(int type, int x, int y)
|
override bool MouseEvent(int type, int x, int y)
|
||||||
{
|
{
|
||||||
let li = mFocusControl;
|
let li = mFocusControl;
|
||||||
|
|
Loading…
Reference in a new issue