HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 09.11.2021, 17:13
lyricshvh
Новичок
Регистрация: 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
;
}
 
Ответить с цитированием

  #2  
Старый 09.11.2021, 17:29
legendabrn
Участник форума
Регистрация: 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
;
}
 
Ответить с цитированием

  #3  
Старый 09.11.2021, 17:33
lyricshvh
Новичок
Регистрация: 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
;
}


а так спасибо большое!
 
Ответить с цитированием

  #4  
Старый 09.11.2021, 17:36
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Если что-то можно сделать без сампа - нужно сделать это без сампа
 
Ответить с цитированием

  #5  
Старый 09.11.2021, 17:36
lyricshvh
Новичок
Регистрация: 02.11.2021
Сообщений: 6
С нами: 2384983

Репутация: 1
По умолчанию



ну работает уже хорошо
 
Ответить с цитированием

  #6  
Старый 09.11.2021, 18:06
legendabrn
Участник форума
Регистрация: 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
)
;
}
 
Ответить с цитированием

  #7  
Старый 09.11.2021, 18:36
lyricshvh
Новичок
Регистрация: 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, и не работает внутри плюсов
 
Ответить с цитированием

  #8  
Старый 09.11.2021, 19:27
kivija3070
Новичок
Регистрация: 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)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.