I made a similar solution in the past. If you dont know how to start, I pasted my old code below, but dont forget: its only an example!!! Dont try to implement the script into your mod, because it is only a part of my complete mod. At first understand the code line by line, after you can try to write your own script. I captured 2 pictures what will help you to understand.
change_strike.menu
PHP Code:
#include "ui_mp/menudef.h"
#define ORIGIN_CHOICE1 40 52
#define ORIGIN_CHOICE2 40 84
#define ORIGIN_CHOICE3 40 116
#define ORIGIN_CHOICE4 40 148
#define ORIGIN_CHOICE5 40 180
#define ORIGIN_CHOICE6 40 212
#define ORIGIN_CHOICE7 40 244
#define button(_name, _orig, _text, _response, _dvartest, _showdvar, _dvartest2, _showdvar2, _points, _kills) \
itemDef \
{ \
name _name \
style WINDOW_STYLE_FILLED \
rect 0 0 256 24 0 0 \
origin _orig \
backcolor 0 0 0 0.9 \
visible 1 \
decoration \
} \
itemDef \
{ \
name _name \
style WINDOW_STYLE_FILLED \
rect 0 0 256 24 0 0 \
origin _orig \
backcolor 1 1 1 0.9 \
dvartest _dvartest2 \
showDvar { _showdvar2 } \
visible 1 \
decoration \
} \
itemDef \
{ \
name _name \
style WINDOW_STYLE_SHADER \
rect 0 0 256 24 0 0 \
origin _orig \
background "rndl_menu_corner_24" \
visible 1 \
decoration \
} \
itemDef \
{ \
name _name \
type ITEM_TYPE_TEXT \
visible 1 \
rect 8 0 0 0 0 0 \
origin _orig \
forecolor 1 0.5 0 1 \
text _text \
textfont UI_FONT_NORMAL \
textscale .30 \
textalign ITEM_ALIGN_LEFT \
textaligny 20 \
dvartest _dvartest \
showDvar { _showdvar } \
decoration \
} \
itemDef \
{ \
name _name \
type ITEM_TYPE_TEXT \
visible 1 \
rect 8 0 0 0 0 0 \
origin _orig \
forecolor GLOBAL_DISABLED_COLOR \
text _text \
textfont UI_FONT_NORMAL \
textscale .30 \
textalign ITEM_ALIGN_LEFT \
textaligny 20 \
dvartest _dvartest \
hideDvar { _showdvar } \
decoration \
} \
itemDef \
{ \
name _name \
style WINDOW_STYLE_SHADER \
rect 184 6 12 12 0 0 \
origin _orig \
background "rndl_menu_strikepoints" \
visible 1 \
dvartest _dvartest \
showDvar { _showdvar } \
decoration \
} \
itemDef \
{ \
name _name \
style WINDOW_STYLE_SHADER \
rect 224 6 12 12 0 0 \
origin _orig \
background "rndl_menu_strikekills" \
visible 1 \
dvartest _dvartest \
showDvar { _showdvar } \
decoration \
} \
itemDef \
{ \
name _name \
type ITEM_TYPE_TEXT \
visible 1 \
rect 208 0 0 0 0 0 \
origin _orig \
forecolor 1 0.5 0 1 \
text _points \
textfont UI_FONT_NORMAL \
textscale .30 \
textalign ITEM_ALIGN_RIGHT \
textaligny 20 \
dvartest _dvartest \
showDvar { _showdvar } \
decoration \
} \
itemDef \
{ \
name _name \
type ITEM_TYPE_TEXT \
visible 1 \
rect 248 0 0 0 0 0 \
origin _orig \
forecolor 1 0.5 0 1 \
text _kills \
textfont UI_FONT_NORMAL \
textscale .30 \
textalign ITEM_ALIGN_RIGHT \
textaligny 20 \
dvartest _dvartest \
showDvar { _showdvar } \
decoration \
} \
itemDef \
{ \
name _name \
visible 1 \
rect 0 0 256 24 0 0 \
origin _orig \
forecolor GLOBAL_UNFOCUSED_COLOR \
type ITEM_TYPE_BUTTON \
dvartest _dvartest \
showDvar { _showdvar } \
action \
{ \
play "mouse_click"; \
setdvar _dvartest2 _showdvar2; \
scriptMenuResponse _response; \
} \
onFocus \
{ \
play "mouse_over"; \
} \
}
{
menuDef
{
name "change_strike"
rect GLOBAL_MENU_SIZE
focuscolor GLOBAL_FOCUSED_COLOR
style WINDOW_STYLE_EMPTY
onOpen
{
setdvar ui_background "background_futuremod";
setdvar ui_sidebar "strike";
open "sidebar";
open "profil";
}
onClose
{
close "sidebar";
close "profil";
}
onEsc
{
close "change_strike";
}
itemDef
{
name background_image
style WINDOW_STYLE_DVAR_SHADER
rect GLOBAL_BACKGROUND_SIZE
dvar "ui_background"
visible 1
decoration
}
itemDef
{
rect 40 20 128 0
type ITEM_TYPE_TEXT
forecolor GLOBAL_UNFOCUSED_COLOR
text "@RNDL_STRIKE_POINTS"
textfont UI_FONT_NORMAL
textscale 0.30
textaligny 0
visible 1
decoration
}
itemDef
{
rect 168 30 0 0
type ITEM_TYPE_TEXT
forecolor GLOBAL_UNFOCUSED_COLOR
dvar "ui_strikepoints"
textfont UI_FONT_NORMAL
textscale 0.55
textaligny 0
visible 1
decoration
}
itemDef
{
rect 192 6 20 20 0 0
style WINDOW_STYLE_SHADER
background "rndl_menu_strikepoints"
visible 1
decoration
}
button("strike_commsat", ORIGIN_CHOICE1, "@RNDL_STRIKE_COMMSAT", "CommSat", "ui_allow_commsat", "1", selected_strike1, "1", 3, 3)
button("strike_emp", ORIGIN_CHOICE2, "@RNDL_STRIKE_EMP", "EMP", "ui_allow_emp", "1", selected_strike2, "1", 3, 4)
button("strike_airstrike", ORIGIN_CHOICE3, "@RNDL_STRIKE_AIRSTRIKE", "Airstrike", "ui_allow_airstrike", "1", selected_strike3, "1", 5, 6)
button("strike_predator", ORIGIN_CHOICE4, "@RNDL_STRIKE_PREDATOR", "Predator", "ui_allow_predator", "1", selected_strike4, "1", 6, 7)
button("strike_sentry", ORIGIN_CHOICE5, "@RNDL_STRIKE_SENTRY", "Sentry", "ui_allow_sentry", "1", selected_strike5, "1", 7, 9)
button("strike_quadrotor", ORIGIN_CHOICE6, "@RNDL_STRIKE_QROTOR", "QuadRotor", "ui_allow_quadrotor", "1", selected_strike6, "1", 8, 11)
button("strike_drone", ORIGIN_CHOICE7, "@RNDL_STRIKE_DRONE", "Drone", "ui_allow_drone", "1", selected_strike7, "1", 10, 15)
#include "ui_mp/scriptmenus/activitynav.menu"
}
}
_strike.gsc
PHP Code:
#include scripts\_utils;
#include scripts\_getset;
init()
{
Settings();
initStrikes();
level.functions["onConnect"][ level.functions["onConnect"].size ] = ::RunOnConnect;
level.functions["onDisconnect"][ level.functions["onDisconnect"].size ] = ::RunOnDisconnect;
level.functions["onSpawn_once"][ level.functions["onSpawn_once"].size ] = ::RunOnSpawn;
level.functions["onPlayerKilled"][ level.functions["onPlayerKilled"].size ] = ::RunOnKilled;
}
Settings()
{
level.strikepoints = 10;
precache_String(&"RNDL_HUD_STRIKE_PRESS");
}
initStrikes()
{
scripts\strike\_uav::init();
scripts\strike\_emptower::init();
scripts\strike\_airstrike::init();
scripts\strike\_mortar::init();
scripts\strike\_sentry::init();
scripts\strike\_quadrotor::init();
scripts\strike\_drone::init();
}
RunOnConnect()
{
player = self;
player endon("disconnect");
player.tmp_strikes = []; // selected strikes
player.pers["strike"] = []; // current strikes
player.strikes = []; // reached strikes
player.kills = 0;
player thread RunOnLogin();
player thread RunOnLogout();
for (;;)
{
player waittill_any("joined_team", "joined_spectators", "killed_player");
player notify("end_strike");
}
}
RunOnDisconnect()
{
player = self;
player notify("end_strike");
}
RunOnLogin()
{
player = self;
player.strikepoints = level.strikepoints;
for (;;)
{
player waittill_any("login", "update_bonus");
wait 0.05;
spent = 0;
for (i = 0; i < player getStrikes().size; i++)
{
spent += getStrike(player getStrikes()[ i ]).point;
}
player.strikepoints = level.strikepoints + getBonus("strike") - spent;
player updateStrikeUI();
}
}
RunOnLogout()
{
player = self;
for (;;)
{
player waittill("logout");
/*
for (i = 0; i < player.pers["strike"].size; i++)
{
strike = getStrike( player.pers["strike"][ i ] );
player setClientCvar(strike.slot, "0");
}*/
player.tmp_strikes = []; // selected strikes
player.pers["strike"] = []; // current strikes
player.strikes = []; // reached strikes
player.strikepoints = 0;
}
}
RunOnSpawn()
{
player = self;
player.pers["strike"] = player.tmp_strikes;
player sortStrikes();
for (i = 0; i < 3; i++)
{
if (isDefined(player.pers["strike"][ i ]) && isStrike(player.pers["strike"][ i ]))
{
icon = getStrike( player.pers["strike"][ i ] ).icon;
if ( isDefined(icon) && icon != "" )
player setClientCvar("hud_strikeslot" + i, icon);
}
else
{
player setClientCvar("hud_strikeslot" + i, "hud_ksicon_empty");
}
}
player thread RunLastStrike();
player createStrikeHUD();
player updateStrikeHUD();
}
RunOnKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration)
{
player = self;
player notify("end_strike");
player.kills = 0;
player deleteStrikeHUD();
if (! isPlayer(eAttacker) || player == eAttacker || player.pers["team"] == eAttacker.pers["team"])
return;
if (! isDefined(eAttacker.pers["strike"]) || ! eAttacker.pers["strike"].size)
return;
oldKills = eAttacker.kills;
eAttacker.kills++;
for (i = 0; i < eAttacker.pers["strike"].size; i++)
{
strike = getStrike( eAttacker.pers["strike"][ i ] );
if (strike.kill <= oldKills)
continue;
if (eAttacker.kills >= strike.kill )
{
eAttacker scripts\gametypes\_notification::Notification(strike.string, strike.hud, strike.sound);
eAttacker.strikes = add_to_array(eAttacker.strikes, eAttacker.pers["strike"][ i ], false);
}
}
eAttacker updateStrikeHUD();
}
RunLastStrike()
{
player = self;
player endon("killed_player");
for (;;)
{
player waittill("menuresponse", menu, response);
if (response == "useStrike" && player.sessionstate == "playing")
{
strikeName = player.strikes[ player.strikes.size - 1 ];
if (isDefined(strikeName))
{
func = getStrike( strikeName ).func;
if ( isDefined(func) )
player thread [[ func ]]();
}
}
wait 0.5;
}
}
addStrike(strikeName)
{
player = self;
strike = getStrike( strikeName );
if ( ! is_in_array( player.tmp_strikes, strikeName ) && player.tmp_strikes.size < 3 && player.strikepoints >= strike.point )
{
player setClientCvar(strike.slot, "1");
player.strikepoints -= strike.point;
//player setStrike( strikeName );
player.tmp_strikes = array_add(player.tmp_strikes, strikeName);
}
else if ( is_in_array( player.tmp_strikes, strikeName ) )
{
player setClientCvar(strike.slot, "0");
player.strikepoints += strike.point;
//player unSetStrike( strikeName );
player.tmp_strikes = array_remove(player.tmp_strikes, strikeName);
}
else
{
player setClientCvar(strike.slot, "0");
}
player updateStrikeUI();
}
sortStrikes()
{
player = self;
if ( isDefined(player.pers["strike"]) )
{
temp = player.pers["strike"];
for (i = 0; i < temp.size - 1; i++)
{
for (j = i + 1; j < temp.size; j++)
{
if (getStrike(temp[ i ]).kill > getStrike(temp[ j ]).kill)
{
var = temp[ i ];
temp[ i ] = temp[ j ];
temp[ j ] = var;
}
}
}
player.pers["strike"] = temp;
}
}
updateStrikeUI()
{
player = self;
player setClientCvar("ui_strikepoints", player.strikepoints);
}
updateStrikeHUD()
{
player = self;
remaining = 0;
strikes = player getStrikes();
for (i = 0; i < strikes.size; i++)
{
strike = getStrike(strikes[ i ]);
if (strike.kill > player.kills)
{
remaining = strike.kill - player.kills;
break;
}
}
if (isDefined(player.strikecounterhud))
player.strikecounterhud setValue(remaining);
}
createStrikeHUD()
{
player = self;
if (! isDefined(player.strikecounterhud))
{
player.strikecounterhud = newClientHudElem(player);
player.strikecounterhud.x = -48;
player.strikecounterhud.y = -150;
player.strikecounterhud.alignX = "left";
player.strikecounterhud.alignY = "top";
player.strikecounterhud.horzAlign = "right";
player.strikecounterhud.vertAlign = "bottom";
player.strikecounterhud.foreground = 1;
player.strikecounterhud.fontscale = 2.4;
player.strikecounterhud.sort = 1;
player.strikecounterhud.alpha = 1;
player.strikecounterhud.color = (0/255, 125/255, 125/255);
}
if (! isDefined(player.strikepresshud))
{
player.strikepresshud = newClientHudElem(player);
player.strikepresshud.x = 0;
player.strikepresshud.y = -30;
player.strikepresshud.alignX = "center";
player.strikepresshud.alignY = "top";
player.strikepresshud.horzAlign = "center";
player.strikepresshud.vertAlign = "bottom";
player.strikepresshud.foreground = 1;
player.strikepresshud.fontscale = 0.8;
player.strikepresshud.sort = 1;
player.strikepresshud.alpha = 1;
player.strikepresshud.color = (255/255, 255/255, 255/255);
player.strikepresshud setText(&"RNDL_HUD_STRIKE_PRESS");
}
}
deleteStrikeHUD()
{
player = self;
if (isDefined(player.strikecounterhud))
player.strikecounterhud destroy();
if (isDefined(player.strikepresshud))
player.strikepresshud destroy();
}
And read Izno's thread: http://killtube.org/showthread.php?9...ng-the-CoD4MoD
(how the hell can i resize the inserted images?)