CSGO Tools V1.3 Данный плагин позволит лучше пощупать возможности сущностей SourceEngine, AcceptEntityInput а так-же просто пофаниться (Я себе повесил арбузы на ноги, руки и голову, проехался на машине влево, заспавнил раунд посреди раунда, выдал себе ночное зрение, отправил друга в космос(Я просто прыгнул) и кикнул бота командой "kill", ). Поддерживаемые игры: - Тестировал только на CSGO, про остальные игры не знаю Спойлер: Команды sm_getmenu - Открывает меню, позволяющее получать данные о сущностях. sm_setentitymodel {entityid} {modelname} - SetEntityModel(entityid, modelname) + PrecacheModel sm_setentitymovetype {entityid} {MoveVype:id} - SetEntityMoveType(entityid, MoveType:id) sm_setentityrendermode {entityid} {RenderMode:id} - SetEntityRenderMode(entityid, RenderMode:id) sm_setentityrendercolor {entityid} {RED} {GREEN} {BLUE} {ALPHA} | Если arg = -1, значение не меняется sm_precachemodel {String:modelpath} - PrecacheModel(modelpath) sm_precachesound {path_to_sound} - Прекеширует звук(например "*/ic/zr_commander/attack.mp3") sm_ent_create {entity_name} - Создает сущность (например "prop_physics"), в чат выводится ID sm_ent_accept_input {entityid} {String:command} {activator} {caller} {outputid} [String:arg], ... sm_ent_key_value {entityid} {String:key} {String:value} - DispatchKeyValue(entityid, key, value) sm_ent_key_float {entityid} {String:key} {Float:value} - DispatchKeyFloat(entityid, key, value) sm_ent_key_vector {entityid} {String:key} {Float:pos1} {Float:pos2} {Float:pos3} - DispatchKeyValue(entityid, key, Float:{pos1, pos2, pos3}) sm_ent_spawn {entityid} - DispatchSpawn(entityid) sm_ent_teleport_to_me {entityid} - Телепортирует entityid к вам sm_ent_teleport_to_aim {entityid} - Телепортирует entityid в точку, на которую смотрите sm_ent_setprop_int {entityid} {String:fieldname} {value} - SetEntProp sm_ent_setprop_float {entityid} {String:fieldname} {Float:value} - SetEntPropFloat sm_ent_setprop_vector {entityid} {String:fieldname} {Float:pos1} {Float:pos2} {Float:pos3}- SetEntPropVector sm_ent_setprop_string {entityid} {String:fieldname} {String:value} - SetEntPropString Спойлер: Команда sm_ent_accept_input Эта команда вызывает функцию AcceptEntityInput таким образом: AcceptEntityInput(entityid, command, activator, caller, outputid) А теперь подробнее о [String:arg]. Их можно вводить сколько угодно, и значение это имеет несколько типов. В общем это функция SetVariantString, SetVariantFloat и т.д. Чтобы вводилось значение как String, надо перед текстом поставить ic_string: , чтобы получилось такая ересь: ic_string:command Спойлер: Примеры Как нацепить на голову игроку проп? Спойлер: Командами sm_ent_accept_input propid "SetParent" client propid 0 "ic_string:!activator" sm_ent_accept_input propid "SetParentAttachment" client propid 0 "ic_string:facemask" Спойлер: Кодом Код: SetVariantString("!activator"); AcceptEntityInput(propid, "SetParent", client, propid, 0); SetVariantString("facemask"); AcceptEntityInput(propid, "SetParentAttachment", client, propid, 0); Спойлер: Типы переменных ic_string - текст ic_int - Целое число ic_float - Дробное число ic_entity - Тоже целое число, но функция SetVarriantEntity и используется entityid Спойлер: Полезное Спойлер: MoveType:ID MOVETYPE_NONE = 0, MOVETYPE_ISOMETRIC = 1, MOVETYPE_WALK = 2, MOVETYPE_STEP = 3, MOVETYPE_FLY = 4, MOVETYPE_FLYGRAVITY = 5, MOVETYPE_VPHYSICS = 6, MOVETYPE_PUSH = 7, MOVETYPE_NOCLIP = 8, MOVETYPE_LADDER = 9, MOVETYPE_OBSERVER = 10, MOVETYPE_CUSTOM = 11, Спойлер: RenderMode:ID RENDER_NORMAL = 0 RENDER_TRANSCOLOR = 1 RENDER_TRANSTEXTURE = 2 RENDER_GLOW = 3 RENDER_TRANSALPHA = 4 RENDER_TRANSADD = 5 RENDER_ENVIRONMENTAL = 6 RENDER_TRANSADDFRAMEBLEND = 7 RENDER_TRANSALPHAADD = 8 RENDER_WORLDGLOW = 9 RENDER_NONE = 10 Примеры команд Спойлер Спойлер: Нацепить на голову арбуз Спойлер: Команды sm_ent_create prop_physics | (Запоминаем число в чате как entityid) sm_ent_key_value entityid "model" "models/props_junk/watermelon01.mdl" sm_ent_spawn entityid sm_ent_key_value entityid "solid" "0" sm_ent_accept_input entityid "SetParent" @me entityid 0 "ic_string:!activator" sm_ent_accept_input entityid "SetParentAttachment" @me entityid 0 "ic_string:facemask" Спойлер: код в sourcepawn new entityid = CreateEntityByName("prop_physics") DispatchKeyValue(entityid, "model", "models/props_junk/watermelon01.mdl") DispatchSpawn(entityid) DispatchKeyValue(entityid, "solid", "0") SetVarriantString("!activator") AcceptEntityInput(entityid, "SetParent", client, entityid, 0); SetVariantString("facemask"); AcceptEntityInput(entityid, "SetParentAttachment", client, entityid, 0); Спойлер: Создать себе красный неон Спойлер: Команды sm_ent_create light_dynamic | (Запоминаем число в чате как entityid) sm_ent_key_value entityid "_light" "255 70 70 255" sm_ent_key_float entityid "distance" "500.0" sm_ent_spawn entityid sm_ent_teleport_to_me entityid sm_ent_accept_input entityid "SetParent" @me entityid "ic_string:!activator" Спойлер: код в sourcepawn new entityid = CreateEntityByName("light_dynamic") DispatchKeyValue(entityid, "_light", "255 70 70 255") DispatchKeyFloat(entityid, "distance", 500.0) DispatchSpawn(entityid) new Float:pos[3] GetClientAbsPosition(client, pos) TeleportEntity(entityid, pos, NULL_VECTOR, NULL_VECTOR) SetVarriantString("!activator") AcceptEntityInput(entityid, "SetParent", client, entityid, 0); Кваров, нативов и форвардов нету, но никто не мешает вам их добавить:) Отдельная благодарность: Спойлер KrolZ - За толчок в мир SourcePawn inklesspen (Да, мне ) - За идею Идеи пишите в ЛС, если есть время и желание, сделаю. И еще, прошу IP серверов с этим плагином мне писать в ЛС. Хочу знать сколько таких серверов :)
@inklesspen, Спойлер: 1 PHP: decl String:arg[4][256] GetCmdArg(1, arg[0], 256) GetCmdArg(2, arg[1], 256) GetCmdArg(3, arg[2], 256) GetCmdArg(4, arg[3], 256) new entity = CheckString(client, arg[0]) if(!YesEntityYes(entity)) { CGOPrintToChat(client, "[{LIGHTGREEN}InkCore{DEFAULT}] Invalid entity", entity) return; } new Float:pos[3] pos[0] = StringToFloat(arg[1]) pos[1] = StringToFloat(arg[2]) pos[2] = StringToFloat(arg[3]) Зачем создать столько строк если можно обойтись одной? Так же нет проверки на количество аргументов. Ну те же ошибки во всех командах. без ; писать не тру. Если будешь лепить в 1 строку - компилятор не поймет. PHP: public bool YesEntityYes(entity){ if(!YesPlayer(entity)&&!YesEntityMe) return false return true} Проще же PHP: bool YesEntityYes(entity){ return (YesPlayer(entity)&&YesEntityMe);} public не нужен во внутренних функциях плагина, только на тех, которые вызываются извне. stock тоже не нужен. Он используется в inc файлах, для того чтобы функции помеченные stock но, которые не используются не включались компилятором в плагин. PHP: for(new i=6;i<=args;i++) { decl String:ink[256] GetCmdArg(i, ink, sizeof(ink)) if(ReplaceString(ink, 256, "ic_string:", "")!=0) Переменную создавай до цикла. И вообще это PHP: if(args>5) { // ... } if(args==2) { AcceptEntityInput(entity, arg) } else if(args==3) { GetCmdArg(3, arg, 256) new param1 = CheckString(client, arg) GetCmdArg(2, arg, 256) AcceptEntityInput(entity, arg, param1) } else if(args==4) { // ... } else if(args>=5) { // ... } Лучше сделать так: Спойлер PHP: switch(args){ case 2: { AcceptEntityInput(entity, arg) } case 3: { GetCmdArg(3, arg, 256) new param1 = CheckString(client, arg) GetCmdArg(2, arg, 256) AcceptEntityInput(entity, arg, param1) } case 4: { GetCmdArg(3, arg, 256) new param1 = CheckString(client, arg) GetCmdArg(4, arg, 256) new param2 = CheckString(client, arg) GetCmdArg(2, arg, 256) AcceptEntityInput(entity, arg, param1, param2) } default: { if(args>5) { decl String:ink[256] for(new i=6;i<=args;i++) { GetCmdArg(i, ink, sizeof(ink)) if(ReplaceString(ink, 256, "ic_string:", "")!=0) { PrintToConsole(client, "Пойман: Строка") SetVariantString(ink) } else if(ReplaceString(ink, 256, "ic_int:", "")!=0) { SetVariantInt(StringToInt(ink)) } else if(ReplaceString(ink, 256, "ic_bool:", "")!=0) { SetVariantBool(bool:StringToInt(ink)) } else if(ReplaceString(ink, 256, "ic_float:", "")!=0) { SetVariantFloat(StringToFloat(ink)) } else if(ReplaceString(ink, 256, "ic_entity:", "")!=0) { SetVariantEntity(StringToInt(ink)) } } } if(args>=5) { GetCmdArg(3, arg, 256) new param1 = CheckString(client, arg) GetCmdArg(4, arg, 256) new param2 = CheckString(client, arg) GetCmdArg(5, arg, 256) new param3 = CheckString(client, arg) GetCmdArg(2, arg, 256) AcceptEntityInput(entity, arg, param1, param2, param3) } }} PHP: int GetClientOnAim(client, bool:originalaimtarget=false){ if(originalaimtarget) return GetClientAimTarget(client, false) decl Float:origin[3], Float:angles[3]; GetClientEyePosition(client, origin); GetClientEyeAngles(client, angles); TR_TraceRayFilter(origin, angles, MASK_SOLID, RayType_Infinite, Filter, client); if (!TR_DidHit()) return -1; new ent = TR_GetEntityIndex(); TR_GetEndPosition(origin); if (ent > 0 && ent <= MaxClients) return ent; else return -1;} Ты будешь удивлено но GetClientAimTarget это и есть [/php]decl Float:origin[3], Float:angles[3]; GetClientEyePosition(client, origin); GetClientEyeAngles(client, angles); TR_TraceRayFilter(origin, angles, MASK_SOLID, RayType_Infinite, Filter, client); if (!TR_DidHit()) return -1; new ent = TR_GetEntityIndex(); TR_GetEndPosition(origin); if (ent > 0 && ent <= MaxClients) return ent; else return -1; [/php] PHP: if(StrEqual(arg, "getmenu_getpropid")) { CGOPrintToChat(client, "[{LIGHTGREEN}InkCore{DEFAULT}] Entity index: %i", lol[0]) } else if(StrEqual(arg, "getmenu_getpropclassname")) { GetEntityClassname(lol[0], arg, sizeof(arg)) CGOPrintToChat(client, "%s %s", PREFIX, arg) } else if(StrEqual(arg, "getmenu_getplayerhealth")) { CGOPrintToChat(client, "%s %i", PREFIX, GetClientHealth(lol[0])) } else if(StrEqual(arg, "getmenu_getplayeruserid")) { CGOPrintToChat(client, "%s %i", PREFIX, GetClientUserId(lol[0])) } else if(StrEqual(arg, "getmenu_getmyuserid")) { CGOPrintToChat(client, "%s %i", PREFIX, GetClientUserId(client)) } else if(StrEqual(arg, "getmenu_getmyid")) { CGOPrintToChat(client, "%s %i", PREFIX, client, GetClientUserId(client)) } else if(StrEqual(arg, "getmenu_select_player")) { GetPlayerMenu(client) } else if(StrEqual(arg, "getmenu_getproppos")) { new Float:pos[3] GetEntPropVector(lol[0], Prop_Send, "m_vecOrigin", pos) CGOPrintToChat(client, "%s Position: %f %f %f", PREFIX, pos[0], pos[1], pos[2]) } else if(StrEqual(arg, "getmenu_select_prop")) { GetPropMenu(client) } а почему бы сюда не передавать цифру, а по ней уже switch, так же проще чем со строками.
Я лепил на скорую руку. Мне еще нужно было поработать над плагином ZR Commander от Franc1sco, у него руки не доходят. switch это хорошо, но мне удобнее if, всегда можно взять код и исправить его. У меня эта функция не работала, вот я и решил использовать сразу GetClientAimTarget. Я не знал про это. Эти слова запомню + еще пошарю на wiki. Совсем забыл про проверку... Спасибо --- Добавлено позже --- У меня с цифрами в таком плане проблемы. Опять-же, всегда можно взять код и исправить его. За замечания и помощь спасибо. Обязательно займусь этим --- Добавлено позже --- Дело в том, что переменная "ink" - строка. Так-что я пожалую такое делать не буду.
А, я думал ты говоришь присвоить строке размер, равному кол-ва аргументов, была б строка с размером 6 :D Что и куда изменить? Я немного не понял.
sm_ent_create prop_physics_multiplayer | (запоминаем ID как entityid) sm_ent_key_value entityid "model" "models/props_vehicles/taxi_city.mdl" sm_ent_spawn entityid sm_ent_teleport_to_me entityid Потом залелаем с noclip на 1 седенье, и пишет следующее: sm_ent_accept_input entityid "SetParent" @me entityid "ic_string:!activator" Вырубаем NoClip, и едем влево :) В общем цепляется моделька, но при этом проп толкает игрока, а не на оборот
@inklesspen, так в csgo есть такая функция prop_vehicle и prop_vehicle_driveable. Но пока у меня с ними ни чего, не вышло, лишь только сесть в машину и все..
Не знал. Вообще суть плагина не только в том, чтобы ездить на машинах... А за инфу - спасибо. --- Добавлено позже --- Можно декомпилировать мапу на прохождение для CS:GO (какой-то coop_ карта). Там полюбому будет инфа о транспорте.
Я понимаю что суть не в этом. Это мне для roleplay нужно, а так я подумал возможно он подобное может реализовать, ну видимо нет.
Я немного посидел в мапе... Знаете Garry's mod? Если да, то знаете ли вы, как действуют трусеры(Ну типо активируешь и они движуться в определенную сторону). Так с этими штуками можно создать полноценную машину
@inklesspen, у меня впринципе есть код который создает машину, на ней можно по ездить туда-сюда, по управлять ей и выйти из нее. Мне просто было интересно посредством этого плагина реализовать, ибо мой код получился на 1к строк.