Author |
Message |
|||
Junior Member
|
|
|||
|
Veteran Member
Join Date: Oct 2011 Location: Germany
|
|
|
Junior Member
|
|
|||
|
Veteran Member
Join Date: Nov 2012 Location: void
|
|
|
Junior Member
|
|
|||
|
Junior Member
|
|
|||
|
Junior Member
|
|
|||
|
Veteran Member
Join Date: Nov 2012 Location: void
|
|
|||
|
Junior Member
|
|
|||
|
Veteran Member
Join Date: Nov 2012 Location: void
|
|
|||
|
-
#1
Доброго времени суток.
Я занимался скриптингом на amxmodx и только сегодня перешол на sourcemod.
Написал достаточно простой плагин, но не уверен, что он работает, т.к. не во всех функциях sm разобрался.
И еще. Я не знаю как исправляется ошибка:
Error 100: function prototypes do not match
Warning’и прошу не брать в серьёз. Брал переменную ClientID для будущих нужд.
#include <sourcemod>
new GameValue
new UserID
new UserIDT
new ClientID
public Plugin:myinfo =
{
name = "VErtoe MiniMode",
author = "Primo",
description = "Random modes",
version = "1.0",
}
public OnPluginStart()
{
HookEvent("round_start", VErtoe_Round_Start);
HookEvent("player_spawned", VErtoe_PlayerSpawn);
RegAdminCmd("ghost_on", Command_ghoston);
RegConsoleCmd("ghost_off", Command_ghostoff);
}
public VErtoe_Round_Start(Handle:event, const String:name[], bool:dontBroadcast)
{
UserID = GetEventInt(event, "userid")
ClientID = GetClientOfUserId(UserID)
//GameValue = GetRandomInt(0, 1);
if(GameValue == 1)
{
PrintCenterTextAll("Активирован режим призраков")
}
}
public VErtoe_Round_End(Handle:event, const String:name[], bool:dontBroadcast)
{
return;
}
public GhostGame()
{
SetEntityRenderMode(UserIDT, RenderMode:RENDER_TRANSCOLOR);
SetEntityRenderColor(UserIDT, 255, 255, 255, 0);
}
public VErtoe_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
if(GameValue == 1)
{
if(GetClientTeam(UserID) == 2)
{
UserIDT = GetEventInt(event, "userid")
GhostGame();
}
}
return;
}
public Command_ghoston(client, args)
{
GameValue = 1
return;
}
public Command_ghostoff(client, args)
{
GameValue = 0
return;
}
P.S. Если есть ошибки, а они точно есть, то прошу писать без грубостей…
- Команда форума
-
#2
Primo,
public VErtoe_Round_Start(Handle:event, const String:name[], bool:dontBroadcast)
{
UserID = GetEventInt(event, "userid")
ClientID = GetClientOfUserId(UserID)
//GameValue = GetRandomInt(0, 1);
if(GameValue == 1)
{
PrintCenterTextAll("Активирован режим призраков")
}
}
Ты не можешь получить индекс клиента из хандла эвента старта раунда.
HookEvent("player_spawned", VErtoe_PlayerSpawn);
Нет такого эвента, есть player_spawn.
public VErtoe_Round_End(Handle:event, const String:name[], bool:dontBroadcast)
{
return;
}
Это что вообще?
public GhostGame()
{
SetEntityRenderMode(UserIDT, RenderMode:RENDER_TRANSCOLOR);
SetEntityRenderColor(UserIDT, 255, 255, 255, 0);
}
Ты не передал аргумента, чтобы присваивать ему цвет.
public Command_ghoston(client, args)
{
GameValue = 1
return;
}
public Command_ghostoff(client, args)
{
GameValue = 0
return;
}
return Plugin_Handled; пиши. И еще это Action
RegAdminCmd("ghost_on", Command_ghoston);
Нет 3-го аргумента — флага доступа.
Исправленый код:
#include <sourcemod>
new GameValue
public Plugin:myinfo =
{
name = "VErtoe MiniMode",
author = "Primo",
description = "Random modes",
version = "1.0",
}
public OnPluginStart()
{
HookEvent("round_start", VErtoe_Round_Start);
HookEvent("player_spawn", VErtoe_PlayerSpawn);
RegAdminCmd("ghost_on", Command_ghoston, ADMFLAG_BAN);
RegAdminCmd("ghost_off", Command_ghostoff, ADMFLAG_BAN);
}
public VErtoe_Round_Start(Handle:event, const String:name[], bool:dontBroadcast)
{
if(GameValue == 1) PrintCenterTextAll("Активирован режим призраков")
}
public GhostGame(client)
{
SetEntityRenderMode(client, RenderMode:RENDER_TRANSCOLOR);
SetEntityRenderColor(client, 255, 255, 255, 0);
}
public VErtoe_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
if(GameValue == 1)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"))
if(GetClientTeam(client) == 2) GhostGame(client);
}
}
public Action:Command_ghoston(client, args)
{
GameValue = 1
return Plugin_Handled;
}
public Action:Command_ghostoff(client, args)
{
GameValue = 0
return Plugin_Handled;
}
KorDen
Atra esterní ono thelduin!
-
#3
Primo, спаун игрока — player_spawn (а не player_spawned)
UserID = GetEventInt(event, «userid»)
ClientID = GetClientOfUserId(UserID)
Традиционно userid нигде не используется, поэтому сразу обычно делают client = GetClientOfUserId(GetEventInt(event, «userid»))
В RoundStart нет никакого userid, нужно в playerspawn это делать
SetEntityRenderMode, SetEntityRenderColor, GetClientTeam, и вообще почти все функции, использующие ID игрока — в них надо ClientId а не UserId передавать
function prototypes do not match — это на какую строчку ругается?
-
#4
Я использовал традиционную wiki по Sourcemod, там был эвент player_spawned, ну он так назывался…
Спасибо за уделённое время.
Добавлено через 5 часов 13 минут
Ошибки понял, разобрался.
Но не разобрался кое в чем. При данном коде должен, по идеи, при спавне террорист становится невидимым, если GameValue = 1, также писать в чат соответствующее сообщение, но это не работает.
#include <sourcemod>
new GameValue
public Plugin:myinfo =
{
name = "VErtoe MiniMode",
author = "Primo",
description = "Random modes",
version = "1.0",
}
public OnPluginStart()
{
HookEvent("round_start", VErtoe_Round_Start);
HookEvent("player_spawned", VErtoe_PlayerSpawn);
RegAdminCmd("ghost_on", Command_ghoston, ADMFLAG_BAN);
RegAdminCmd("ghost_off", Command_ghostoff, ADMFLAG_BAN);
}
public VErtoe_Round_Start(Handle:event, const String:name[], bool:dontBroadcast)
{
if(GameValue == 1) PrintCenterTextAll("Активирован режим призраков")
}
public VErtoe_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
if(GameValue == 1)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"))
if(GetClientTeam(client) == 2)
{
PrintToChatAll("Активирован режим призраков, террористы будут призраками");
SetEntityRenderMode(client, RenderMode:RENDER_TRANSCOLOR);
SetEntityRenderColor(client, 255, 255, 255, 0);
}
}
}
public Action:Command_ghoston(client, args)
{
PrintToChatAll("Активирован режим призраков");
GameValue = 1
return Plugin_Handled;
}
public Action:Command_ghostoff(client, args)
{
PrintToChatAll("Деактивирован режим призраков");
GameValue = 0
return Plugin_Handled;
}
Последнее редактирование: 30 Янв 2014
- Команда форума
-
#5
Это наоборот видимый
SetEntityRenderColor(client, 255, 255, 255, 0);
Вот
SetEntityRenderColor(client, 0, 0, 0, 0);
-
#6
Хорошо. Но а то, что
PrintToChatAll("Активирован режим призраков, террористы будут призраками");
должно писаться всегда, когда кто-то спавнится за террористов?
- Команда форума
-
#7
HookEvent("player_spawn", VErtoe_PlayerSpawn);
Говорили уже
-
#8
Я пишу для cs go, и, как говорит wiki, там player_spawned
Wiki
-
#9
Это наоборот видимый
SetEntityRenderColor(client, 255, 255, 255, 0);
Вот
SetEntityRenderColor(client, 0, 0, 0, 0);
Там прозрачность нулевая, т.ч. там всё равно, черная или белая будет модель.
Primo, там нету ничего что должно не работать, больше склоняюсь в евенту спавна. Замени на
HookEvent("player_spawn", VErtoe_PlayerSpawn);
и увидишь что все работает
-
#10
Там прозрачность нулевая, т.ч. там всё равно, черная или белая будет модель.
Primo, там нету ничего что должно не работать, больше склоняюсь в евенту спавна. Замени на
HookEvent("player_spawn", VErtoe_PlayerSpawn);
и увидишь что все работает
Тогда чем регулировать прозрачность, если прозрачным не становятся таким способом?
-
#11
это rgba (red green blue alfa) значение. alfa — прозрачность. Поставь 125 и увидишь полупрозрачного белого игрока.
-
#12
Это я всё знаю, но проблема в том, что прозрачность не устанавливается, или я что-то не так делаю…
-
#13
Это я всё знаю, но проблема в том, что прозрачность не устанавливается, или я что-то не так делаю…
Не работает в КС гоу прозрачность!
-
#14
Не работает в КС гоу прозрачность!
Сказали бы сразу…
Тогда другой вопрос.
Как я понял, функция, отвечающая за удаление оружия — RemovePlayerItem(client, item);?
Если это так, то 2 аргумент указывать слот игрока или определённое оружие weapon_*? Мне нужно, чтобы все оружия пропадали.
- Команда форума
-
#15
KorDen
Atra esterní ono thelduin!
-
#17
Какой функцией можно проверить на бота? Т.е. является ли игрок ботом или нет.
Нужно отсеять ботов от людей, а функции найти не могу. Под носом вертится только IsClientAuthorized
- Команда форума
-
#18
-
#19
Попробую
Добавлено через 16 часов 54 минуты
Знает ли кто, как вызывать функцию ClientCommand(client, «r_screenoverlay *.vmt») безc sv_cheats 1?
Последнее редактирование: 1 Фев 2014
На чтение 3 мин. Просмотров 32 Опубликовано 15.12.2019
I have a program with 2 functions, one of them counts number of words in a file, and works perfectly, and the other one counts the number of tymes a specific word appears in file. This las function does work perfectly (i have tested it isolated from the main), but when i ordered everything in the main, with a functions.h file, i get this.
The function with the problem is word_cnt(FILE*, char*)
when i compile, i get this:
word.c:3:5: error: conflicting types for ‘word_cnt’ int word_cnt(FILE* fp, char* argv[2])
in the word.c file, (file which contains the word_cnt function with the problem) the function is defined like this
and in the header file, the prototype is like this:
I do not understand. the definition is correct, why does the compiler think i am redefyning it?
- Pawn скриптинг
- Первая помощь
- Проблемы с компилированием
- Правила форума
- Просмотр новых публикаций
Содержание
- Обозначение ошибок и предупреждений Обновлено 18.08.2017
- Primo
- KorDen
- Primo
Обозначение ошибок и предупреждений Обновлено 18.08.2017
- Группа: Администраторы
- Сообщений: 6 900
- Регистрация: 14 Август 11
Ошибки в консоли
%s — имя переменной/макроса/аргумента функции.
Авторы: OKStyle, webserfer, Kaza40k, [Nos]B[R]aiN[L], Ym[0]n, _volk_, ДениСыч, Roman1us, m1n1vv
Primo
IN UNITY
Доброго времени суток.
Я занимался скриптингом на amxmodx и только сегодня перешол на sourcemod.
Написал достаточно простой плагин, но не уверен, что он работает, т.к. не во всех функциях sm разобрался.
И еще. Я не знаю как исправляется ошибка:
Error 100: function prototypes do not match
Warning’и прошу не брать в серьёз. Брал переменную ClientID для будущих нужд.
всё тлен
Ты не можешь получить индекс клиента из хандла эвента старта раунда.
Нет такого эвента, есть player_spawn.
Ты не передал аргумента, чтобы присваивать ему цвет.
KorDen
Atra esterní ono thelduin!
Primo, спаун игрока — player_spawn (а не player_spawned)
User )
Client >
Традиционно user ))
В RoundStart нет никакого userid, нужно в playerspawn это делать
SetEntityRenderMode, SetEntityRenderColor, GetClientTeam, и вообще почти все функции, использующие ID игрока — в них надо ClientId а не UserId передавать
function prototypes do not match — это на какую строчку ругается?
Primo
IN UNITY
Я использовал традиционную wiki по Sourcemod, там был эвент player_spawned, ну он так назывался.
Спасибо за уделённое время.
Добавлено через 5 часов 13 минут
Ошибки понял, разобрался.
Но не разобрался кое в чем. При данном коде должен, по идеи, при спавне террорист становится невидимым, если GameValue = 1, также писать в чат соответствующее сообщение, но это не работает.
-
#1
C++:
public OnClientPutInServer(int client)
{
CreateTimer(5.0, Cheat_check, _,TIMER_REPEAT);
}
public Action Cheat_check (Handle:timer, int client, int args)
{
QueryClientConVar(client, "sv_cheats", GetClientVarCheats);
QueryClientConVar(client, "r_drawothermodels", GetClientVarWalls);
QueryClientConVar(client, "host_timescale", GetClientVarTime);
QueryClientConVar(client, "mat_wireframe", GetClientVarWire);
QueryClientConVar(client, "r_drawparticles", GetClientVarParticle);
}
The Line :
CreateTimer(5.0, Cheat_check, _,TIMER_REPEAT);
has error:
error 100: function prototypes do not match
@Vertigo Can you fix this??
-
#2
Remove int args
from public Action Cheat_check (Handle:timer, int client, int args)
-
#3
But why are you checking these cvars ?
Client can never use them unless server itself has set sv_cheats
to 1.
-
#4
But why are you checking these cvars ?
Client can never use them unless server itself has setsv_cheats
to 1.
Engine.dll has some bugs which allows players to use cheat engine and use these commands for native wallhacks
-
#5
And what makes you think this will stop them.
If it was that easy to just query the cvars and kick/ban them, then there would be no cheaters.
The only way to stop it is to prevent the program on client side itself.
Which means they must install a program provided by you.
-
#6
And what makes you think this will stop them.
If it was that easy to just query the cvars and kick/ban them, then there would be no cheaters.
The only way to stop it is to prevent the program on client side itself.
Which means they must install a program provided by you.
I can make a program but it is not at all guaranteed that the player will install it.
By making a plugin, I can at least try that someone is not using hacks in my server.
I know there are many ways to inject dll in clientmod.( One of way, is through CFF explorer and adding xyz.dll in table of inputsystem.dll in bin folder of Clientmod)
I and you also know that cheaters are not going to stop.
That doesn’t mean that we will stop trying to stop them using hacks.
I am just trying my best from server-side.
-
#7
I understand what you are upto.
I am just pointing this is not the right way to deal with it.
Querying these cvars definitely not.
If you look at smac source code, it already does that whatever you are trying to do.
-
#8
I understand what you are upto.
I am just pointing this is not the right way to deal with it.
Querying these cvars definitely not.
If you look at smac source code, it already does that whatever you are trying to do.
I understand your point of view.
I will not make this plugin.
-
#9
Anyway you can try different options if you want.
Trying to code something new is always fun.
-
#10
Anyway you can try different options if you want.
Trying to code something new is always fun.
I am working on new plugin (pause for warmod)
By the way, coding is way more fun.
public PlVers:__version =
{
version = 5,
filevers = «1.6.0-dev+3871»,
date = «04/10/2013»,
time = «23:16:57»
};
new Float:NULL_VECTOR[3];
new String:NULL_STRING[4];
public Extension:__ext_core =
{
name = «Core»,
file = «core»,
autoload = 0,
required = 0,
};
new MaxClients;
public Extension:__ext_sdktools =
{
name = «SDKTools»,
file = «sdktools.ext»,
autoload = 1,
required = 1,
};
new votecount;
new bool:voteEnded;
new bool:timerCreated;
new bool:didclientVote[32];
new Handle:sm_rebootvote_type;
new Handle:sm_rebootvote_map;
new playeronline;
public Plugin:myinfo =
{
name = «Dota 2 — Server reboot voter.»,
description = «Server reboot/map reload voter.»,
author = «Playstation 3»,
version = «1.0»,
url = «»
};
public __ext_core_SetNTVOptional()
{
MarkNativeAsOptional(«GetFeatureStatus»);
MarkNativeAsOptional(«RequireFeature»);
MarkNativeAsOptional(«AddCommandListener»);
MarkNativeAsOptional(«RemoveCommandListener»);
MarkNativeAsOptional(«BfWriteBool»);
MarkNativeAsOptional(«BfWriteByte»);
MarkNativeAsOptional(«BfWriteChar»);
MarkNativeAsOptional(«BfWriteShort»);
MarkNativeAsOptional(«BfWriteWord»);
MarkNativeAsOptional(«BfWriteNum»);
MarkNativeAsOptional(«BfWriteFloat»);
MarkNativeAsOptional(«BfWriteString»);
MarkNativeAsOptional(«BfWriteEntity»);
MarkNativeAsOptional(«BfWriteAngle»);
MarkNativeAsOptional(«BfWriteCoord»);
MarkNativeAsOptional(«BfWriteVecCoord»);
MarkNativeAsOptional(«BfWriteVecNormal»);
MarkNativeAsOptional(«BfWriteAngles»);
MarkNativeAsOptional(«BfReadBool»);
MarkNativeAsOptional(«BfReadByte»);
MarkNativeAsOptional(«BfReadChar»);
MarkNativeAsOptional(«BfReadShort»);
MarkNativeAsOptional(«BfReadWord»);
MarkNativeAsOptional(«BfReadNum»);
MarkNativeAsOptional(«BfReadFloat»);
MarkNativeAsOptional(«BfReadString»);
MarkNativeAsOptional(«BfReadEntity»);
MarkNativeAsOptional(«BfReadAngle»);
MarkNativeAsOptional(«BfReadCoord»);
MarkNativeAsOptional(«BfReadVecCoord»);
MarkNativeAsOptional(«BfReadVecNormal»);
MarkNativeAsOptional(«BfReadAngles»);
MarkNativeAsOptional(«BfGetNumBytesLeft»);
MarkNativeAsOptional(«PbReadInt»);
MarkNativeAsOptional(«PbReadFloat»);
MarkNativeAsOptional(«PbReadBool»);
MarkNativeAsOptional(«PbReadString»);
MarkNativeAsOptional(«PbReadColor»);
MarkNativeAsOptional(«PbReadAngle»);
MarkNativeAsOptional(«PbReadVector»);
MarkNativeAsOptional(«PbReadVector2D»);
MarkNativeAsOptional(«PbGetRepeatedFieldCount»);
MarkNativeAsOptional(«PbReadRepeatedInt»);
MarkNativeAsOptional(«PbReadRepeatedFloat»);
MarkNativeAsOptional(«PbReadRepeatedBool»);
MarkNativeAsOptional(«PbReadRepeatedString»);
MarkNativeAsOptional(«PbReadRepeatedColor»);
MarkNativeAsOptional(«PbReadRepeatedAngle»);
MarkNativeAsOptional(«PbReadRepeatedVector»);
MarkNativeAsOptional(«PbReadRepeatedVector2D»);
MarkNativeAsOptional(«PbSetInt»);
MarkNativeAsOptional(«PbSetFloat»);
MarkNativeAsOptional(«PbSetBool»);
MarkNativeAsOptional(«PbSetString»);
MarkNativeAsOptional(«PbSetColor»);
MarkNativeAsOptional(«PbSetAngle»);
MarkNativeAsOptional(«PbSetVector»);
MarkNativeAsOptional(«PbSetVector2D»);
MarkNativeAsOptional(«PbAddInt»);
MarkNativeAsOptional(«PbAddFloat»);
MarkNativeAsOptional(«PbAddBool»);
MarkNativeAsOptional(«PbAddString»);
MarkNativeAsOptional(«PbAddColor»);
MarkNativeAsOptional(«PbAddAngle»);
MarkNativeAsOptional(«PbAddVector»);
MarkNativeAsOptional(«PbAddVector2D»);
MarkNativeAsOptional(«PbReadMessage»);
MarkNativeAsOptional(«PbReadRepeatedMessage»);
MarkNativeAsOptional(«PbAddMessage»);
VerifyCoreVersion();
return 0;
}
PrintToChatAll(String:format[])
{
decl String:buffer[192];
new i = 1;
while (i <= MaxClients)
{
if (IsClientInGame(i))
{
SetGlobalTransTarget(i);
VFormat(buffer, 192, format, 2);
PrintToChat(i, «%s», buffer);
i++;
}
i++;
}
return 0;
}
public OnPluginStart()
{
AddCommandListener(Command_Say, «say»);
AddCommandListener(Command_Say, «say_team»);
playeronline = 0;
sm_rebootvote_type = CreateConVar(«sm_rebootvote_type», «0», «Reboot the server = 0 || Change the map = 1», 0, false, 0, false, 0);
sm_rebootvote_map = CreateConVar(«sm_rebootvote_map», «riverofsouls», «The map you want to change into when the vote is passed.», 0, false, 0, false, 0);
return 0;
}
public OnClientPutInServer(client)
{
if (IsClientSourceTV(client))
{
return 0;
}
playeronline += 1;
return 0;
}
public OnClientDisconnect(client)
{
if (IsClientSourceTV(client))
{
return 0;
}
playeronline -= 1;
return 0;
}
public Action:Command_Say(client, String:command[], args)
{
decl String:sayString[32];
decl String:clientName[32];
new maxVotesr;
GetCmdArg(1, sayString, 32);
GetClientName(client, clientName, 32);
GetCmdArgString(sayString, 32);
StripQuotes(sayString);
if (!strcmp(sayString, «-vb», false))
{
if (IsClientSourceTV(client))
{
return Action:0;
}
if (GetClientTeam(client) != 2)
{
PrintToChat(client, «You have no right to vote.»);
return Action:0;
}
if (didclientVote[client][0][0])
{
PrintToChat(client, «You have already voted for a server reboot.»);
return Action:0;
}
votecount += 1;
if (playeronline <= 3)
{
maxVotesr = 1;
}
else
{
if (playeronline <= 5)
{
maxVotesr = 3;
}
if (playeronline <= 7)
{
maxVotesr = 5;
}
if (playeronline ==
{
maxVotesr = 6;
}
maxVotesr = 7;
}
PrintToChatAll(«%s have voted for a server reboot (%d / %d)», clientName, votecount, maxVotesr);
if (votecount < maxVotesr)
{
voteEnded = 0;
didclientVote[client] = 1;
if (!timerCreated)
{
timerCreated = 1;
CreateTimer(30, checkForVotes, any:0, 0);
}
}
if (votecount >= maxVotesr)
{
if (!voteEnded)
{
voteEnded = 1;
votecount = 0;
CreateTimer(1, ExitServer, any:0, 3);
}
}
}
return Action:0;
}
public Action:ExitServer(Handle:Timer, client)
{
static repeatNumber;
new voteType = GetConVarInt(sm_rebootvote_type);
new String:mapName[32];
GetConVarString(sm_rebootvote_map, mapName, 32);
if (repeatNumber >= 9)
{
repeatNumber = 0;
if (voteType)
{
ServerCommand(«map %s», mapName);
}
else
{
ServerCommand(«exit»);
}
reSetVotes();
return Action:4;
}
if (voteType)
{
PrintToChatAll(«Changing map to %s in %d», mapName, 9 — repeatNumber);
}
else
{
PrintToChatAll(«Server will reboot in %d», 9 — repeatNumber);
}
repeatNumber += 1;
return Action:0;
}
public Action:checkForVotes(Handle:Timer, client)
{
if (voteEnded)
{
return Action:0;
}
PrintToChatAll(«Vote failed, server will not reboot.»);
reSetVotes();
return Action:0;
}
public reSetVotes()
{
voteEnded = 0;
timerCreated = 0;
votecount = 0;
new i = 1;
while (i <= 32)
{
didclientVote = 0;
i++;
}
return 0;
}
Нажмите, чтобы раскрыть…
Binary validation failed: Method FindClassByName failed verification: Invalid instruction
Internal compilation error detected. Please file a bug:
https://github.com/alliedmodders/sourcepawn/issues/new
Metamod:Source Version Information
Metamod:Source version 1.11.0-dev+1145
Plugin interface version: 16:14
SourceHook version: 5:5
Loaded As: Valve Server Plugin
Compiled on: Jul 12 2021 05:28:44
Built from: https://github.com/alliedmodders/metamod-source/commit/0bb53f2
Build ID: 1145:0bb53f2
SourceMod Version Information:
SourceMod Version: 1.11.0.6800
SourcePawn Engine: 1.11.0.6800, jit-x86 (build 1.11.0.6800)
SourcePawn API: v1 = 5, v2 = 14
Compiled on: Oct 27 2021 19:46:13
Built from: https://github.com/alliedmodders/sourcemod/commit/10795fbe
Build ID: 6800:10795fbe
FindClassByName
stock bool FindClassByName (const char[] name, ServerClass out)
{
ServerClass current; current = g_pServerClassHead;
for (;;)
{
if ( strcmp(current.name, name, false) == 0 )
{
out = current;
return true;
}
if ( !current.IsValidNext() )
break;
current = GetNextClass(current);
}
}
Full code
#pragma semicolon 1
#pragma newdecls required
#include <sourcemod>
#include <sdktools>
#define SEND_PROP_SIZE 0x54
#define INTERFACEVERSION_SERVERGAMEDLL "ServerGameDLL005"
enum SendPropType
{
DPT_Int,
DPT_Float,
DPT_Vector,
DPT_VectorXY, // Only encodes the XY of a vector, ignores Z
DPT_String,
DPT_Array, // An array of the base types (can't be of datatables).
DPT_DataTable,
DPT_Int64,
DPT_NUMSendPropTypes
};
enum EServerClass
{
m_pNetworkName,
m_pTable = 4,
m_pNext = 8,
m_ClassID = 12,
m_InstanceBaselineIndex = 16
}
enum ESendTable
{
m_pProps,
m_nProps = 4,
m_pNetTableName = 8
};
enum ESendProp
{
m_Type = 8,
m_pVarName = 48,
m_ProxyFn = 64,
m_pDataTable = 72
};
enum struct SendProp
{
SendPropType type;
Address sendtable;
Address proxy;
char name[64];
bool filled;
Address me;
void Fill (Address prop)
{
if ( this.filled )
return;
GetString(LoadFromAddress(prop + view_as<Address>(m_pVarName), NumberType_Int32), this.name, sizeof SendProp::name);
this.type = view_as<SendPropType>(LoadFromAddress(prop + view_as<Address>(m_Type), NumberType_Int32));
this.sendtable = LoadFromAddress(prop + view_as<Address>(m_pDataTable), NumberType_Int32);
this.proxy = prop + view_as<Address>(m_ProxyFn);
this.me = prop;
}
}
enum struct SendTable
{
Address props;
int numprops;
char name[64];
bool filled;
Address me;
void Fill (Address table)
{
if ( this.filled )
return;
GetString(LoadFromAddress(table + view_as<Address>(m_pNetTableName), NumberType_Int32), this.name, sizeof SendTable::name);
this.props = table + view_as<Address>(m_pProps);
this.numprops = LoadFromAddress(table + view_as<Address>(m_nProps), NumberType_Int32);
this.me = table;
}
}
enum struct ServerClass
{
char name[64];
SendTable table;
Address next;
int classid;
int baseline;
bool filled;
Address me;
void Fill (Address class)
{
if ( this.filled || !class )
return;
GetString(LoadFromAddress(class, NumberType_Int32), this.name, sizeof ServerClass::name);
this.table.Fill(LoadFromAddress(class + view_as<Address>(m_pTable), NumberType_Int32));
this.next = LoadFromAddress(class + view_as<Address>(m_pNext), NumberType_Int32);
this.classid = LoadFromAddress(class + view_as<Address>(m_ClassID), NumberType_Int32);
this.baseline = LoadFromAddress(class + view_as<Address>(m_InstanceBaselineIndex), NumberType_Int32);
this.me = class;
this.filled = true;
}
bool IsValidNext()
{
return this.me && LoadFromAddress(this.me + view_as<Address>(m_pNext), NumberType_Int32) != Address_Null;
}
}
ServerClass g_pServerClassHead;
public int NAT_FindServerClass (Handle hPlugin, int numParams)
{
char name[64]; ServerClass class;
GetNativeString(1, name, sizeof name);
bool ret = FindClassByName(name, class);
SetNativeArray(2, class, sizeof ServerClass);
return ret;
}
public int NAT_FindSendProp (Handle hPlugin, int numParams)
{
char netclass[64], prop_name[64];
GetNativeString(1, netclass, sizeof netclass);
GetNativeString(2, prop_name, sizeof prop_name);
SendProp prop;
bool ret = FindSendProp (netclass, prop_name, prop);
SetNativeArray(3, prop, sizeof SendProp);
return ret;
}
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
CreateNative("Proxy_FindServerClass", NAT_FindServerClass);
CreateNative("Proxy_FindSendProp", NAT_FindSendProp);
return APLRes_Success;
}
public void OnPluginStart()
{
Handle call;
StartPrepSDKCall(SDKCall_Static);
PrepSDKCall_SetSignature(SDKLibrary_Server, "@CreateInterface", 0);
PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer);
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Pointer, VDECODE_FLAG_ALLOWNULL);
PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain);
call = EndPrepSDKCall();
g_pServerClassHead.Fill(GetServerClassHead(call));
delete call;
}
Address GetServerClassHead(Handle call)
{
Address ptr = SDKCall(call, INTERFACEVERSION_SERVERGAMEDLL, 0);
StartPrepSDKCall(SDKCall_Raw);
PrepSDKCall_SetVirtual(10);
PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain);
Handle get = EndPrepSDKCall();
ptr = SDKCall(get, ptr);
delete get;
return ptr;
}
stock any[] GetSendProp (SendTable table, int prop)
{
SendProp sendprop; sendprop.Fill(LoadFromAddress(table.props, NumberType_Int32) + prop * SEND_PROP_SIZE);
return sendprop;
}
stock bool FindSendProp (const char[] netclass, const char[] propname, SendProp out)
{
ServerClass class;
if ( !FindClassByName(netclass, class) )
return false;
return FindSendPropTable(class.table, propname, out);
}
stock bool FindSendPropTable (SendTable table, const char[] propname, SendProp out)
{
SendProp prop; SendTable sendtable;
for (int i; i < table.numprops; i++)
{
prop = GetSendProp(table, i);
if ( strcmp(prop.name, propname, false) == 0 )
{
out = prop;
return true;
}
if ( prop.sendtable )
{
sendtable.Fill(prop.sendtable);
if ( FindSendPropTable(sendtable, propname, out) )
return true;
}
}
return false;
}
stock bool FindClassByName (const char[] name, ServerClass out)
{
ServerClass current; current = g_pServerClassHead;
for (;;)
{
if ( strcmp(current.name, name, false) == 0 )
{
out = current;
return true;
}
if ( !current.IsValidNext() )
break;
current = GetNextClass(current);
}
}
stock any[] GetNextClass (ServerClass class)
{
ServerClass nextclass;
if ( class.me )
nextclass.Fill(view_as<Address>(LoadFromAddress(class.me + view_as<Address>(m_pNext), NumberType_Int32)));
return nextclass;
}
stock void GetString (Address ptr, char[] buffer, int len)
{
int byte, counter;
while ((byte = LoadFromAddress(ptr + view_as<Address>(counter), NumberType_Int8)) != '' && counter <= len - 1)
{
buffer[counter] = view_as<char>(byte);
counter++;
}
}
#include <sourcemod>
#include <sdktools>
#include <cstrike>
#include <clientprefs>
#include <sdkhooks>
#pragma semicolon 1
#pragma newdecls required
#define nullstr NULL_STRING
public Plugin myinfo =
{
name = «sklepsms»,
author = «fejmek»,
version = «1.0»,
url = «»
};
public void OnPluginStart()
{
RegConsoleCmd(«sm_sklepsms», command_sklep);
}
public void command_sklep (int client)
{
Menu menu = new Menu(Menu_Handler);
menu.SetTitle(«SKLEP SMSn n»);
menu.AddItem(nullstr, «Ceny VIPa»);
menu.AddItem(nullstr, «Zakup VIPa»);
menu.AddItem(nullstr, «Aktywacja VIPa»);
menu.AddItem(nullstr, «Korzyści VIPa»);
menu.Display(client, 60);
}
public int Menu_Handler(Menu menu, MenuAction action, int client, int a)
{
switch(action)
{
case MenuAction_Select:
{
switch(a)
{
case 0: DrawPanel(client, «1,23zł — 1 dzień n4,92zł — 1 tydzień n8,61 zł — 2 tygodnie n9,84zł — 3 tygodnie n12,30zł — 1 miesiąc n23,37zł — 2 miesiące n24,60zł — 3 miesiące n30,75zł — 4 miesiące»);
case 1: DrawPanel(client, «Wyślij sms o treści ‘SHOT’ na numer: (zapisz kod który otrzymasz) n7136 — 1,23zł n7455 — 4,92zł n77464 — 8,61zł n78464 — 9,84zł n91055 — 12.30zł n91955 — 23,37zł n92055 — 24,60zł 92555 — 30,75zł «);
case 2: DrawPanel(client, «Musisz skontaktować sie z Fejmkiem !fejmek i wysłać mu kod otrzymany sms»);
case 3: FakeClientCommandEx(client, «sm_funkcjevipa»);
}
}
case MenuAction_End:
delete menu;
}
return 0;
}
public void DrawPanel(int client, const char[] buffer)
{
Panel panel = new Panel();
panel.SetTitle(«Sklepsms»);
panel.DrawText(«—————————————«);
panel.DrawText(buffer);
panel.DrawText(«—————————————«);
panel.DrawItem(«Wróć»);
panel.DrawItem(«Wyjdź»);
panel.Send(client, PanelHandler, 30);
delete panel;
}
public int PanelHandler(Menu menu, MenuAction action, int client, int item)
{
switch(action)
{
case MenuAction_Select:
{
switch(item)
{
case 1: command_sklep(client);
case 2: delete menu;
}
}
}
}