AMX MOD X
Пятница, 25.09.2020, 04:33:47



Приветствую Вас Гость | RSS
[ Главная ] [ математическая функция - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » математическая функция (странности...)
математическая функция
xaxexaДата: Вторник, 12.05.2009, 13:44:34 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 11
Репутация: 0
Статус: Не в сети
переменная загружается из мускула (ячейка dicemal, дробная)

затем при смерти производятся штуки вот такие :)

register_cvar("amx_kill_cost", "0.90") //цена убийства
register_cvar("amx_death_cost", "1.00") // цена смерти
register_event("DeathMsg", "onDeath", "a") //регистрация эвента смерти

new Float:UserPoints[33] //переменная дробная берется из mysql...

SQL_ReadResult(query, 0, UserPoints[id])
server_print("[AMXX] %f", UserPoints[id])

public onDeath(id)
{
new Float:kill_cost = get_cvar_float("amx_kill_cost") //задается цена
server_print("[AMXX] %f", kill_cost) //для отладки :)
new Float:death_cost = get_cvar_float("amx_death_cost")
server_print("[AMXX] %f", death_cost)
new iKiller = read_data(1) //вроде как чтение ID убийцы
new iVictim = read_data(2) //вроде как чтение ID жертвы
new Float:plusPoints = UserPoints[iKiller] + kill_cost //прибавка очков убийце
new Float:minusPoints = UserPoints[iVictim] - death_cost //забирание очков у жертвы
UserPoints[iKiller] = plusPoints //Заполнение изначальной переменной убийцы
UserPoints[iVictim] = minusPoints //Заполнение изначальной переменной жертвы
server_print("[AMXX] killer %f", UserPoints[iKiller]) //Для отладки :)
server_print("[AMXX] dead %f", UserPoints[iVictim])
}

вроде как все работает (тестил сам с 2ух компов)

но есть изъяны...

вопервых переменная из базы загружается не точно как она там есть, а с припиской вабще левых чисел
например в базе значение 321,35, а в SQL_ReadResult(query, 0, UserPoints[id]) server_print("[AMXX] %f", UserPoints[id]) выводит 321,350006

когда заполняются переменные new Float:kill_cost и new Float:death_cost, на моем примере это 0.9 и 1.0

1.0 все нормально, а вот с 0.9 странно если набрать в консоли amx_kill_cost выводится 0.9, а в функции (первые 2 строки в public onDeath(id)) почемуто пишет 0.899999и тд

или мб поможет ограничение чисел с права от запятой?? только незнаю как :(

Добавлено (2009-05-12, 1:44 Pm)
---------------------------------------------
ап boyan

Сообщение отредактировал xaxexa - Понедельник, 11.05.2009, 18:39:32
 
PAHANCSДата: Вторник, 12.05.2009, 14:17:56 | Сообщение # 2
Полковник
Группа: Пользователи
Сообщений: 183
Репутация: 4
Статус: Не в сети
Quote (xaxexa)
new iKiller = read_data(1) //вроде как чтение ID убийцы
new iVictim = read_data(2) //вроде как чтение ID жертвы

После этого лучше добавить :

Code

if(iKiller < 1 || iKiller > 32) return PLUGIN_CONTINUE
if(iVictim < 1 || iVictim > 32) return PLUGIN_CONTINUE

Или :

Code

if(!is_user_connected(iKiller)) return PLUGIN_CONTINUE
if(!is_user_connected(iVictim)) return PLUGIN_CONTINUE

А то иногда бывает "read_data" возвращает индекс более или менее чем игрока.

Quote (xaxexa)
new Float:kill_cost = get_cvar_float("amx_kill_cost") //задается цена
server_print("[AMXX] %f", kill_cost) //для отладки

new Float:death_cost = get_cvar_float("amx_death_cost")
server_print("[AMXX] %f", death_cost)

Может кудато в память используется, или ещё что, попробуй на прямую использовать
везде может будет лучше:

Code

server_print("[AMXX] %f", get_cvar_float("amx_kill_cost"))
server_print("[AMXX] %f", get_cvar_float("amx_death_cost"))
И т.д.

Quote (xaxexa)
в базе значение 321,35, а в SQL_ReadResult(query, 0, UserPoints[id])
server_print("[AMXX] %f", UserPoints[id]) выводит 321,350006

Мне кажется в базе значение 321,35 хранится обрезаное, потому как остаток 0006 почти
ничего незначит, даже можно сделать так:

Code

server_print("[AMXX] %i", floatround(UserPoints[id]))
И т.д.


PAHANCS

Сообщение отредактировал PAHANCS - Вторник, 12.05.2009, 14:42:26
 
slogicДата: Вторник, 12.05.2009, 14:58:26 | Сообщение # 3
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
при работе с дробными значениями при чтении их принято округлять до нужной тебе точности. т.о. получаем распространенную ошибку, когда дробные значения сравниваются друг с дургом или с нулем (я про оператор ==), что делать нельзя без предварительной обработки значений.
 
xaxexaДата: Среда, 13.05.2009, 23:36:38 | Сообщение # 4
Рядовой
Группа: Пользователи
Сообщений: 11
Репутация: 0
Статус: Не в сети
PAHANCS, спасиба, учту, папробую :)

slogic, а как в pawn округлять до сотых?

Добавлено (2009-05-13, 11:36 Pm)
---------------------------------------------
вобщим забил на эти дроби тк конец шестисправоциферной %) переменной особой роли не играет

за проверку if(iKiller < 1 || iKiller > 32) return PLUGIN_CONTINUE спасиба

и как я понимаю PLUGIN_CONTINUE просто прекращает текущую функцию?

Сообщение отредактировал xaxexa - Среда, 13.05.2009, 23:04:56
 
PAHANCSДата: Четверг, 14.05.2009, 12:32:50 | Сообщение # 5
Полковник
Группа: Пользователи
Сообщений: 183
Репутация: 4
Статус: Не в сети
Quote (xaxexa)
как я понимаю PLUGIN_CONTINUE просто прекращает текущую функцию?

Смотреть ниже


PAHANCS

Сообщение отредактировал PAHANCS - Пятница, 15.05.2009, 07:25:32
 
slogicДата: Четверг, 14.05.2009, 20:11:47 | Сообщение # 6
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Quote (xaxexa)
и как я понимаю PLUGIN_CONTINUE просто прекращает текущую функцию?

нет. return прекращает выполнение. а возврат значения PLUGIN_CONTINUE в обработчике события, зарегистрированного с пом. register_event() вообще не имеет смысла.
 
slogicДата: Четверг, 14.05.2009, 20:18:17 | Сообщение # 7
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Quote (xaxexa)
slogic, а как в pawn округлять до сотых?

я про округление не говорил. сравнить два числа с точностью до сотых можешь так: if(floatabs(val1 - val2) < 0.01).
если все-таки нужно округление до сотых, то умножаешь число на 100, берешь целую часть (floatround()) и делишь на 100.
 
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » математическая функция (странности...)
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2020