urlencode:
Code:
new const sHexTable[] = "0123456789abcdef"
stock urlencode(const sString[], out[], len) {
new from, c
new to
new sResult[301]
while(from < len) {
c = sString[from++]
if(c == 0) {
sResult[to++] = c
break
}
else if(c == ' '){
sResult[to++] = '+'
}
else if((c < '0' && c != '-' && c != '.') ||
(c < 'A' && c > '9') ||
(c > 'Z' && c < 'a' && c != '_') ||
(c > 'z')) {
if((to + 4) > len) {
sResult[to] = 0
break
}
sResult[to++] = '%'
sResult[to++] = sHexTable[c >> 4]
sResult[to++] = sHexTable[c & 15]
}
else {
sResult[to++] = c
}
}
copy(out, len, sResult)
}
stock de joropito
___________________________________
Separa los números de un string y los inserta en un array.
Code:
stock str_to_arraynum(sznum[], output[], len)
{
new i, j, k, c, temp[6], end = strlen(sznum)
for(i = 0; i <= end; i++)
{
if(sznum[i] == ' ' || i == end)
{
output[j++] = str_to_num(temp)
for(c = 0; c < k; c++) temp[c] = 0;
k = 0
}
if(j > len) return j;
temp[k++] = sznum[i]
}
return j;
}
e.g.
Code:
new szData[] = "5 1 2 1"
new iValues[4]
str_to_arraynum(szData, iValues, 3)
// iValues[0] = 5
// iValues[1] = 1
// iValues[2] = 2
// iValues[3] = 1
___________________________________
Comprobar player valido en menu.
Code:
stock check_player_menu(szData[], &iPlayer)
{
static szId[6], szUserid[8]
parse(szData, szId, 5, szUserid, 7)
iPlayer = str_to_num(szId)
if(is_user_connected(iPlayer) && get_user_userid(iPlayer) == str_to_num(szUserid))
return 1
return 0
}
e.g.
Code:
public show_menu_test(id)
{
new name[32], data[11]
new menu = menu_create("Players:", "menu_test")
for(new i = 1; i <= g_maxplayers; i++)
{
if(!is_user_connected(i)) continue
get_user_name(i, name, 31)
formatex(data, 10, "%d %d", i, get_user_userid(i))
menu_additem(menu, name, data)
}
menu_display(id, menu, 0)
}
public menu_test(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
new data[11], null[2]
menu_item_getinfo(menu, item, null[0], data, 10, null, 1, null[0])
new player
if(!check_player_menu(data, player))
{
client_print(id, print_chat, "player invalido :S")
menu_destroy(menu)
return PLUGIN_HANDLED
}
menu_destroy(menu)
return PLUGIN_HANDLED
}
___________________________________
WaterLevel.
Code:
Float:UTIL_WaterLevel(const Float:position[3], Float:minz, Float:maxz)
{
new Float:midUp[3]
midUp = position
midUp[2] = minz
if(point_contents(midUp) != CONTENTS_WATER)
return minz
midUp[2] = maxz
if(point_contents(midUp) == CONTENTS_WATER)
return maxz
new loop
new Float:diff = maxz - minz
while(diff > 1.0)
{
midUp[2] = minz + diff/2.0
if(point_contents(midUp) == CONTENTS_WATER)
minz = midUp[2]
else
maxz = midUp[2]
diff = maxz - minz
loop++
}
return midUp[2]
}
__________________