 |

09.11.2021, 17:13
|
|
Новичок
Регистрация: 02.11.2021
Сообщений: 6
С нами:
2384983
Репутация:
1
|
|
Добрый день всем, пишу мод с нуля на плюсах с другом, я дурак в плюсах, пока его нету, пытаюсь сделать систему пейдея
Тут был пример использование settimer
Пример функции для каллбекка внутри сеттаймера:
Код:
void
SAMPGDK_CALL
PrintTickCountTimer
(
int
timerid
,
void
*
params
)
{
sampgdk
::
logprintf
(
"Tick count: %d"
,
GetTickCount
(
)
)
;
}
как используется settimer:
Код:
PLUGIN_EXPORT
bool
PLUGIN_CALL
OnGameModeInit
(
)
{
SetTimer
(
1000
,
true
,
PrintTickCountTimer
,
0
)
;
return
true
;
}
Проблема в том что, в сеттаймере не указываются аргументы функции "PrintTickCountTimer"
Payday на основе примера:
Код:
void
GiveHours
(
int
playerid
)
{
Player
[
playerid
]
.
pHours
++
;
}
void
SAMPGDK_CALL
PayDay
(
int
playerid
,
int
timerid
,
void
*
params
)
{
char
string
[
144
]
;
GiveHours
(
playerid
)
;
sprintf
(
string
,
"Вы уже отыграли: %d часов"
,
Player
[
playerid
]
.
pHours
)
;
SendClientMessage
(
playerid
,
-
1
,
string
)
;
}
PLUGIN_EXPORT
bool
PLUGIN_CALL
OnPlayerUpdate
(
int
playerid
)
{
SetTimer
(
1000
,
true
,
PayDay
(
playerid
)
,
0
)
;
// на этой строчке у пейдея выводит ошибку, пытался с идом и без все так же о том что слишком мало аргументов, без скобок ошибка так же есть
return
true
;
}
|
|
|

09.11.2021, 17:29
|
|
Участник форума
Регистрация: 08.03.2019
Сообщений: 121
С нами:
3781678
Репутация:
113
|
|
C++:
Код:
void
GiveHours
(
int
playerid
)
{
Player
[
playerid
]
.
pHours
++
;
}
void
SAMPGDK_CALL
PayDay
(
int
timerid
,
void
*
params
)
{
int
playerid
=
*
reinterpret_cast
(
params
)
;
char
string
[
144
]
;
GiveHours
(
playerid
)
;
sprintf
(
string
,
"Вы уже отыграли: %d часов"
,
Player
[
playerid
]
.
pHours
)
;
SendClientMessage
(
playerid
,
-
1
,
string
)
;
}
PLUGIN_EXPORT
bool
PLUGIN_CALL
OnPlayerUpdate
(
int
playerid
)
{
SetTimer
(
1000
,
true
,
PayDay
,
&
playerid
)
;
return
true
;
}
|
|
|

09.11.2021, 17:33
|
|
Новичок
Регистрация: 02.11.2021
Сообщений: 6
С нами:
2384983
Репутация:
1
|
|
Сообщение от legendabrn
C++:
Код:
void
GiveHours
(
int
playerid
)
{
Player
[
playerid
]
.
pHours
++
;
}
void
SAMPGDK_CALL
PayDay
(
int
timerid
,
void
*
params
)
{
int
playerid
=
*
reinterpret_cast
(
params
)
;
char
string
[
144
]
;
GiveHours
(
playerid
)
;
sprintf
(
string
,
"Вы уже отыграли: %d часов"
,
Player
[
playerid
]
.
pHours
)
;
SendClientMessage
(
playerid
,
-
1
,
string
)
;
}
PLUGIN_EXPORT
bool
PLUGIN_CALL
OnPlayerUpdate
(
int
playerid
)
{
SetTimer
(
1000
,
true
,
PayDay
,
&
playerid
)
;
return
true
;
}
Не увидел ваш ответ, но вроде сделал и работает без вас щас
C++:
Код:
void
SAMPGDK_CALL
PayDay
(
int
timerid
,
void
*
params
)
{
char
string
[
144
]
;
int
playerid
=
reinterpret_cast
(
params
)
;
GiveHours
(
playerid
)
;
sprintf
(
string
,
"Вы уже отыграли: %d часов"
,
Player
[
playerid
]
.
pHours
)
;
SendClientMessage
(
playerid
,
-
1
,
string
)
;
}
PLUGIN_EXPORT
bool
PLUGIN_CALL
OnPlayerUpdate
(
int
playerid
)
{
SetTimer
(
1000
*
60
,
true
,
PayDay
,
(
void
*
)
playerid
)
;
return
true
;
}
а так спасибо большое!
|
|
|

09.11.2021, 17:36
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Если что-то можно сделать без сампа - нужно сделать это без сампа
|
|
|

09.11.2021, 17:36
|
|
Новичок
Регистрация: 02.11.2021
Сообщений: 6
С нами:
2384983
Репутация:
1
|
|
ну работает уже хорошо
|
|
|

09.11.2021, 18:06
|
|
Участник форума
Регистрация: 08.03.2019
Сообщений: 121
С нами:
3781678
Репутация:
113
|
|
только я не понял, зачем каждый раз при обновление игрока создавать таймер, лучше в коннект всунь при успешной авторизации, или создай один глобальный таймер, где будешь перебирать через цикл игроков на сервере
ну а если решишь передавать более двух параметров, то как пример:
C++:
Код:
struct
sPayDay
{
int
playerid
;
const
char
*
text
;
}
;
std
::
vector
vPayPay
;
void
PayDay
(
void
*
params
)
{
size_t pos
=
*
reinterpret_cast
(
params
)
-
1
;
if
(
vPayPay
.
at
(
pos
)
.
text
)
{
char
string
[
144
]
;
sprintf
(
string
,
"Переданный текст: %s"
,
vPayPay
.
at
(
pos
)
.
text
)
;
SendClientMessage
(
playerid
,
-
1
,
string
)
;
}
vPayPay
.
erase
(
vPayPay
.
begin
(
)
+
pos
)
;
}
PLUGIN_EXPORT
bool
PLUGIN_CALL
OnPlayerUpdate
(
int
playerid
)
{
if
(
playerid
==
1
)
vPayPay
.
push_back
(
{
playerid
,
"you id: 1!"
}
)
;
else
vPayPay
.
push_back
(
{
playerid
,
0
}
)
;
size_t size
=
vPayPay
.
size
(
)
;
PayDay
(
&
size
)
;
}
|
|
|

09.11.2021, 18:36
|
|
Новичок
Регистрация: 02.11.2021
Сообщений: 6
С нами:
2384983
Репутация:
1
|
|
Сообщение от legendabrn
только я не понял, зачем каждый раз при обновление игрока создавать таймер, лучше в коннект всунь при успешной авторизации, или создай один глобальный таймер, где будешь перебирать через цикл игроков на сервере
ну а если решишь передавать более двух параметров, то как пример:
C++:
Код:
struct
sPayDay
{
int
playerid
;
const
char
*
text
;
}
;
std
::
vector
vPayPay
;
void
PayDay
(
void
*
params
)
{
size_t pos
=
*
reinterpret_cast
(
params
)
-
1
;
if
(
vPayPay
.
at
(
pos
)
.
text
)
{
char
string
[
144
]
;
sprintf
(
string
,
"Переданный текст: %s"
,
vPayPay
.
at
(
pos
)
.
text
)
;
SendClientMessage
(
playerid
,
-
1
,
string
)
;
}
vPayPay
.
erase
(
vPayPay
.
begin
(
)
+
pos
)
;
}
PLUGIN_EXPORT
bool
PLUGIN_CALL
OnPlayerUpdate
(
int
playerid
)
{
if
(
playerid
==
1
)
vPayPay
.
push_back
(
{
playerid
,
"you id: 1!"
}
)
;
else
vPayPay
.
push_back
(
{
playerid
,
0
}
)
;
size_t size
=
vPayPay
.
size
(
)
;
PayDay
(
&
size
)
;
}
Да моя ошибка что я там создаю в onPlayerUpdate и там уже каждый раз создается таймер и у меня каждую секунду выдается уровень, я решил поставить по твоему совету на onplayerconnect работает все, но нужно теперь как то понимать чтоб начинать отсчет ровно в 00:00 каждого часа я находил инклуд dos но он для просто C, и не работает внутри плюсов
|
|
|

09.11.2021, 19:27
|
|
Новичок
Регистрация: 26.10.2021
Сообщений: 14
С нами:
2395546
Репутация:
8
|
|
Сообщение от lyricshvh
Да моя ошибка что я там создаю в onPlayerUpdate и там уже каждый раз создается таймер и у меня каждую секунду выдается уровень, я решил поставить по твоему совету на onplayerconnect работает все, но нужно теперь как то понимать чтоб начинать отсчет ровно в 00:00 каждого часа я находил инклуд dos но он для просто C, и не работает внутри плюсов
Ой по сути все ***ня и говнокод. Тут 2 пути. 1) Сделай нормальныю систему для эвентов. 2) Сделай костыль. Первое ищи на гите, т.к думаю просто так только там кто то выложить может. Ну а второе:
- При старте сервера, посчитай сколько времени осталось до следующего часа
- Поставь таймер на это время, который вызовет функцию InitPaydayTimer
- В этой функции в самом начале, отмени текущий таймер, вызови функцию onPayday, и создай таймер на 1 час, который вызывать будет onPayday
Главное, все это (коме функии onPayday), вынести в отдельный файл, и никогда туда больше не заходи (чтоб не растраиваться).
В самой onPayday просто пройдись по списку игроков, и выдай бонусы
|
|
|
|
 |
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|