 |
|

13.01.2021, 13:40
|
|
Постоянный
Регистрация: 03.05.2020
Сообщений: 385
С нами:
3174020
Репутация:
213
|
|
Сообщение от SR_team
11 строк вместо 2х
дело ведь не в количестве строк 🥲
|
|
|

13.01.2021, 13:43
|
|
Новичок
Регистрация: 20.12.2020
Сообщений: 19
С нами:
2842170
Репутация:
13
|
|
Сообщение от SC6UT
дело ведь не в количестве строк 🥲
Я тоже не про количество, мне просто интересно как заменить это.
|
|
|

13.01.2021, 14:03
|
|
Постоянный
Регистрация: 03.05.2020
Сообщений: 385
С нами:
3174020
Репутация:
213
|
|
Сообщение от S0meTh1n69
Тим, напиши пожалуйста как можно заменить эти 11 строк твоими 2
C++:
Код:
void
add_chat_message
(
DWORD dwColor
,
LPCSTR szString
,
.
.
.
)
{
va_list ap
;
char
msg
[
/* SAMP_MAX_CHAT_MESSAGE*/
144
]
=
{
0
}
;
va_start
(
ap
,
szString
)
;
vsprintf_s
(
msg
,
szString
,
ap
)
;
va_end
(
ap
)
;
DWORD base
=
reinterpret_cast
(
GetModuleHandleW
(
L
"samp.dll"
)
)
;
typedef
void
(
__thiscall
*
CChat__AddEntry
)
(
void
*
,
int
,
char
*
,
char
*
,
DWORD
,
DWORD
)
;
reinterpret_cast
(
base
+
/* SAMP_PTR_FUNC_ADDTOCHATWND */
0x64010
)
(
*
reinterpret_cast
(
base
+
/* SAMP_PTR_CHAT_INFO */
0x21A0E4
)
,
8
,
msg
,
0
,
dwColor
,
0
)
;
}
Сообщение от SR_team
11 строк вместо 2х
почему 2? можно и 1 😀
|
|
|

13.01.2021, 19:50
|
|
Познающий
Регистрация: 20.08.2019
Сообщений: 75
С нами:
3543821
Репутация:
63
|
|
Почему не работает? Вроде же все норм делаю или нет? Когда нажимаю H игра просто виснет @SC6UT @KiN4StAt help pls
вот это:
Код:
#include
#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
static
bool
activated
=
false
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
initialized
=
true
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
}
}
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'H'
)
)
{
activated
=
true
;
}
while
(
activated
)
{
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
Say
(
"/edit"
)
;
Sleep
(
2500
)
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}
|
|
|

13.01.2021, 20:03
|
|
Постоянный
Регистрация: 03.05.2020
Сообщений: 385
С нами:
3174020
Репутация:
213
|
|
Сообщение от Sana_Minotazaki
игра просто виснет
нельзя делать Sleep в mainloop, ты останавливаешь всю игру, а не только свой плагин. так же нельзя делать while в mainloop, да и нет смысла, так как mainloop вызывается постоянно. используй if и GetTickCount (функция которая берет текущее количество пройденых милисекунд с запуска системы, 1000 милисекунд = 1 секунда), вот так:
C++:
Код:
#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
static
bool
activated
=
false
;
static
DWORD dwTime
=
0
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
initialized
=
true
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
}
}
else
{
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'H'
)
)
{
// активирует и деактивирует на ту же кнопку
activated
=
!
activated
;
}
if
(
activated
&&
GetTickCount
(
)
-
dwTime
>=
/* время ожидания */
2500
)
{
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
Say
(
"/edit"
)
;
dwTime
=
GetTickCount
(
)
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}
|
|
|

13.01.2021, 20:10
|
|
Познающий
Регистрация: 20.08.2019
Сообщений: 75
С нами:
3543821
Репутация:
63
|
|
Сообщение от SC6UT
нельзя делать Sleep в mainloop, ты останавливаешь всю игру, а не только свой плагин. так же нельзя делать while в mainloop, да и нет смысла, так как mainloop вызывается постоянно. используй if и GetTickCount (функция которая берет текущее количество пройденых милисекунд с запуска системы, 1000 милисекунд = 1 секунда), вот так:
C++:
Код:
#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
static
bool
activated
=
false
;
static
DWORD dwTime
=
0
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
initialized
=
true
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
}
}
else
{
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'H'
)
)
{
// активирует и деактивирует на ту же кнопку
activated
=
!
activated
;
}
if
(
activated
&&
GetTickCount
(
)
-
dwTime
>
/* время ожидания */
2500
)
{
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
Say
(
"/edit"
)
;
dwTime
=
GetTickCount
(
)
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}
Игра уже не виснет, но команда отправляется только тогда когда я жму H а не циклически как хотелось
|
|
|

13.01.2021, 20:14
|
|
Постоянный
Регистрация: 03.05.2020
Сообщений: 385
С нами:
3174020
Репутация:
213
|
|
Сообщение от Sana_Minotazaki
Игра уже не виснет, но команда отправляется только тогда когда я жму H а не циклически как хотелось
команда отправляется каждые 2.5 секунды, можешь проверить это добавлением логгированием в месте отправления команды
решил добавить фикс краша по адрессу 0x0072CD14 в сф плагин. заметил, что при отгрузке плагина через pfree или просто выходе из игры, то функция хука пропадает быстрее, чем сам хук снимается и игра крашится. когда я делал тоже самое в проекте с аси плагином, то всё было окей. как можно это исправить?
хук я ставлю в DLL_PROCESS_ATTACH, а снимаю в DLL_PROCESS_DETACH.
|
|
|

13.01.2021, 22:05
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
Сообщение от SC6UT
решил добавить фикс краша по адрессу 0x0072CD14 в сф плагин. заметил, что при отгрузке плагина через pfree или просто выходе из игры, то функция хука пропадает быстрее, чем сам хук снимается и игра крашится. когда я делал тоже самое в проекте с аси плагином, то всё было окей. как можно это исправить?
хук я ставлю в DLL_PROCESS_ATTACH, а снимаю в DLL_PROCESS_DETACH.
У SF плагинов есть специальный коллбек, который выполняется перед выгрузкой
|
|
|

13.01.2021, 22:18
|
|
Познающий
Регистрация: 20.08.2019
Сообщений: 75
С нами:
3543821
Репутация:
63
|
|
Как мне в сф сделать onServerMessage как в луа?
|
|
|

13.01.2021, 22:20
|
|
Постоянный
Регистрация: 03.05.2020
Сообщений: 385
С нами:
3174020
Репутация:
213
|
|
Сообщение от SR_team
специальный коллбек
не нахожу, можешь ткнуть пальцем пожалуйста
Сообщение от Sana_Minotazaki
Как мне в сф сделать onServerMessage как в луа?
регистрируешь в mainloop коллбек на приходящие rpc, читаешь данные, взаимодействуешь:
C++:
Код:
// регистрируем коллбек в mainloop
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
// проверяем что пришло рпц сообщения в чат по id
if
(
params
->
packetId
==
RPC_ScrClientMessage
)
{
DWORD color
;
// цвет
DWORD length
;
// длинна сообщения
char
message
[
256
]
;
// сообщение
// читаем данные
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
length
)
;
params
->
bitStream
->
Read
(
message
,
length
)
;
message
[
length
]
=
'\0'
;
// ставим в конце массава NULL чтобы превратить наш массив символов в стринг
// взаимодействуем
}
return
true
;
// возвращаем true чтобы рпц принимались
}
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|