ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   С++ gdk samp plugins (https://forum.antichat.xyz/showthread.php?t=1407875)

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

Цитата:

Сообщение от 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
;
}



а так спасибо большое!

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

Цитата:

Сообщение от 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, и не работает внутри плюсов

kivija3070 09.11.2021 19:27

Цитата:

Сообщение от lyricshvh

Да моя ошибка что я там создаю в onPlayerUpdate и там уже каждый раз создается таймер и у меня каждую секунду выдается уровень, я решил поставить по твоему совету на onplayerconnect работает все, но нужно теперь как то понимать чтоб начинать отсчет ровно в 00:00 каждого часа я находил инклуд dos но он для просто C, и не работает внутри плюсов

Ой по сути все ***ня и говнокод. Тут 2 пути. 1) Сделай нормальныю систему для эвентов. 2) Сделай костыль. Первое ищи на гите, т.к думаю просто так только там кто то выложить может. Ну а второе:

- При старте сервера, посчитай сколько времени осталось до следующего часа

- Поставь таймер на это время, который вызовет функцию InitPaydayTimer

- В этой функции в самом начале, отмени текущий таймер, вызови функцию onPayday, и создай таймер на 1 час, который вызывать будет onPayday

Главное, все это (коме функии onPayday), вынести в отдельный файл, и никогда туда больше не заходи (чтоб не растраиваться).

В самой onPayday просто пройдись по списку игроков, и выдай бонусы


Время: 10:27