Просмотр полной версии : С++ gdk samp plugins
lyricshvh
09.11.2021, 17:13
Добрый день всем, пишу мод с нуля на плюсах с другом, я дурак в плюсах, пока его нету, пытаюсь сделать систему пейдея
Тут был пример использование 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
;
}
legendabrn
09.11.2021, 17:29
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
;
}
lyricshvh
09.11.2021, 17:33
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
;
}
а так спасибо большое!
kin4stat
09.11.2021, 17:36
Если что-то можно сделать без сампа - нужно сделать это без сампа
lyricshvh
09.11.2021, 17:36
https://forum.antichat.xyz/attachments/27883643/
ну работает уже хорошо
legendabrn
09.11.2021, 18:06
только я не понял, зачем каждый раз при обновление игрока создавать таймер, лучше в коннект всунь при успешной авторизации, или создай один глобальный таймер, где будешь перебирать через цикл игроков на сервере
ну а если решишь передавать более двух параметров, то как пример:
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
)
;
}
lyricshvh
09.11.2021, 18:36
только я не понял, зачем каждый раз при обновление игрока создавать таймер, лучше в коннект всунь при успешной авторизации, или создай один глобальный таймер, где будешь перебирать через цикл игроков на сервере
ну а если решишь передавать более двух параметров, то как пример:
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, и не работает внутри плюсов
kivija3070
09.11.2021, 19:27
Да моя ошибка что я там создаю в onPlayerUpdate и там уже каждый раз создается таймер и у меня каждую секунду выдается уровень, я решил поставить по твоему совету на onplayerconnect работает все, но нужно теперь как то понимать чтоб начинать отсчет ровно в 00:00 каждого часа я находил инклуд dos но он для просто C, и не работает внутри плюсов
Ой по сути все ***ня и говнокод. Тут 2 пути. 1) Сделай нормальныю систему для эвентов. 2) Сделай костыль. Первое ищи на гите, т.к думаю просто так только там кто то выложить может. Ну а второе:
- При старте сервера, посчитай сколько времени осталось до следующего часа
- Поставь таймер на это время, который вызовет функцию InitPaydayTimer
- В этой функции в самом начале, отмени текущий таймер, вызови функцию onPayday, и создай таймер на 1 час, который вызывать будет onPayday
Главное, все это (коме функии onPayday), вынести в отдельный файл, и никогда туда больше не заходи (чтоб не растраиваться).
В самой onPayday просто пройдись по списку игроков, и выдай бонусы
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot