Форум /forum/ Форум Tue, 13 Oct 2015 22:47:05 GMT uCoz Web-Service События в SourcePawn /forum/6-79-1 Tue, 13 Oct 2015 22:47:05 GMT Форум: <a href="/forum/6">Уроки SourceMod (SourcePawn) Скриптинга</a><br />Описание темы: http://forum.sn-project.ru/viewtopic.php?f=75&amp;t=1973<br />Автор темы: root<br />Автор последнего сообщения: Гость_<br />Количество ответов: 3 <b>События в SourcePawn</b> <br /><br /> События - сообщения, используемые сервером для передачи сообщений и данных <br /><br /> <b>Введение</b> <br /> События описаны в .res файлах мода в папке resource. "Стандартные" события находятся в hl2/resource/gameevents.res и hl2/resource/serverevents.res. Мод может расширить эти события с помощью расширений. <br /> Для примера посмотрим на player_death из hl2/resource/gameevents.res: <br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->"player_death" <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"userid"&nbsp;&nbsp;&nbsp;"short"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// user ID убитого&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"attacker"&nbsp;&nbsp;&nbsp;"short"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// user ID убийцы <br /> }<!--/uzc--></div></div><!--/uzcode--> <br /> Counter-Strike:Source расширяет это описание в cstrike/resource/modevents.res:<!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->"player_death" <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"userid"&nbsp;&nbsp;&nbsp;"short"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// user ID убитого&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"attacker"&nbsp;&nbsp;&nbsp;"short"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// user ID убийцы <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"weapon"&nbsp;&nbsp;&nbsp;"string"&nbsp;&nbsp;&nbsp;&nbsp;// название оружие, которым убил убийца&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"headshot"&nbsp;&nbsp;&nbsp;"bool"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// сигнал попадания в голову <br /> }<!--/uzc--></div></div><!--/uzcode-->Обратите внимание, что событие состоит в следующем формате: <br /><br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->"name" <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"key1"&nbsp;&nbsp;&nbsp;"valueType1" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"key2"&nbsp;&nbsp;&nbsp;"valueType2" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... <br /> }<!--/uzc--></div></div><!--/uzcode--> <br /> <b>Посылка сообщений</b> <br /> Послать сообщения очень просто. Например мы хотим послать сообщение смерти используя событие player_death описанное выше. Для Counter-Strike:Source, это будет иметь вид: <br /><br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->SendDeathMessage(attacker, victim, const String:weapon&#91;], bool:headshot&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Handle:event = CreateEvent("player_death"&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (event == INVALID_HANDLE&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEventInt(event, "userid", GetClientUserId(victim&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEventInt(event, "attacker", GetClientUserId(attacker&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEventString(event, "weapon", weapon&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEventBool(event, "headshot", headshot&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FireEvent(event&#41; <br /> }<!--/uzc--></div></div><!--/uzcode-->Примечания: <br /> Вы не должны вызывать CloseHandle(), FireEvent() сделает это за вас.Даже если "userid" и "attacker" являются shorts, мы отсылаем их в качестве ints. Термин "short" используется только для того, чтобы сказать движку сколько байт числа необходимо для отправки.Событие может и не создастся; это происходит если событие не существует или никто не перехватывает его. Поэтому вы должны убедиться, что вызовCreateEvent возвращает правильный Handle.Большинство событий используют userids вместо индекса.По умолчанию, FireEvent() посылает сообщения к клиенту. Это можно отключить установив dontBroadcast в true. <br /> <b>Перехват событий</b> <br /> Существует три режима перехвата событий: <br /> Pre - Перехват события до выполнения.Post - Перехват события после выполнения.Post_NoCopy - Перехват события, но не сохраняется любая информация об этом событии (специальная оптимизация). <br /> Перехват событий обычно делается для одной из этих целей. Для того, чтоб понять какой режим использовать, смотрите ниже список целей: <br /> Блокировка события (предотвращение выполнения) <br /> Всегда <b>Pre</b>Изменение события (изменение параметров) <br /> Всегда <b>Pre</b>Выполнить после события (сделать что-то после того как событие произошло) <br /> <b>Pre</b> если ваши действия должны произойти перед выполнением события<b>Post</b> если ваши действия должны произойти после выполнением события<b>PostNoCopy</b> если подходит Post и требуется только имя события<b>Блокировка событий</b> <br /> Блокировку событий сделать очень просто. Например мы хотим заблокировать событие смерти если смерть произошла от попадания в голову:<!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->public OnPluginStart(&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("player_death", Event_PlayerDeath, EventHookMode_Pre&#41; <br /> } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> public Action:Event_PlayerDeath(Handle:event, const String:name&#91;], bool:dontBroadcast&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (GetEventBool(event, "headshot"&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Plugin_Handled <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Plugin_Continue <br /> }<!--/uzc--></div></div><!--/uzcode--> <br /> <b>Изменение событий</b> <br /> Изменить событий тоже очень просто -- события могут быть изменены в режиме перед выполнением события. Например мы хотим убрать попадание в голову со всех событий:<!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->public OnPluginStart(&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("player_death", Event_PlayerDeath, EventHookMode_Pre&#41; <br /> } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> public Action:Event_PlayerDeath(Handle:event, const String:name&#91;], bool:dontBroadcast&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEventBool(event, "headshot", false&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Plugin_Continue <br /> }<!--/uzc--></div></div><!--/uzcode--> <br /> <b>Post Перехват событий</b> <br /> По умолчанию используется перехват после события и как правило наиболее используемый. Например мы хотим послать сообщение всем игрокам, которые умерли:<!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->public OnPluginStart(&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("player_death", Event_PlayerDeath&#41; <br /> } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> public Event_PlayerDeath(Handle:event, const String:name&#91;], bool:dontBroadcast&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decl String:weapon&#91;64] <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new victimId = GetEventInt(event, "userid"&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new attackerId = GetEventInt(event, "attacker"&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new bool:headshot = GetEventBool(event, "headshot"&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetEventString(event, "weapon", weapon, sizeof(weapon&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decl String:name&#91;64] <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new victim = GetClientOfUserId(victimId&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new attacker = GetClientOfUserId(attackerId&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetClientName(attacker, name, sizeof(name&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintToConsole(victim, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"You were killed by &#92;"%s&#92;" (weapon &#92;"%s&#92;"&#41; (headshot &#92;"%d&#92;"&#41;", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weapon, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headshot&#41; <br /> }<!--/uzc--></div></div><!--/uzcode-->Это будет писать игроку в консоли кто его убил, с каким оружием и было ли попадание в голову. <br /> Обратите внимание, что возвращение значений с перехвата после события игнорируется, поэтому тег Action не нужен. <br /><br /> <b>PostNoCopy Перехват событий</b> <br /> Наконец есть перехваты где требуется только имя события. PostNoCopy специальная оптимизация для этого. При переходе от Pre к Post, SourceMod должен дублировать событие и все значения. PostNoCopy предотвращает это. <br /> Например мы хотим найти когда происходят определенные события.<!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->public OnPluginStart(&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("game_newmap", GameEvents, EventHookMode_PostNoCopy&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("game_start", GameEvents, EventHookMode_PostNoCopy&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("game_end", GameEvents, EventHookMode_PostNoCopy&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("game_message", GameEvents, EventHookMode_PostNoCopy&#41; <br /> } <br /><br /> public GameEvents(Handle:event, const String:name&#91;], bool:dontBroadcast&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintToServer("Event has been fired (event &#92;"%s&#92;"&#41; (nobcast &#92;"%d&#92;"&#41;", name, dontBroadcast&#41; <br /> }<!--/uzc--></div></div><!--/uzcode--> <br /><br /> Обратите внимание, что как и обычный Post перехват, он не требует возврата значений. Однако, параметр event для PostNoCopy всегда должен быть равным INVALID_HANDLE. Таким образом параметр name должен использоваться вместо GetEventName. <br /><br /> <a class="link" href="http://goo.gl/E7yDu" rel="nofollow" target="_blank"><span style="color:#0000ff"><b>Оригинал</b></span></a> Уроки SourceMod (SourcePawn) Скриптинга root /forum/6-79-1 HookEvent - Отлавливаем события /forum/6-14-1 Sat, 31 Aug 2013 08:43:30 GMT Форум: <a href="/forum/6">Уроки SourceMod (SourcePawn) Скриптинга</a><br />Описание темы: Взято с world-source.ru<br />Автор темы: root<br />Автор последнего сообщения: ĈỢŇŠỞŁỂ<br />Количество ответов: 3 <a class="link" target="_blank" href="/go?http://wiki.alliedmods.net/Game_Events_(Source" title="http://wiki.alliedmods.net/Game_Events_(Source" rel="nofollow">http://wiki.alliedmods.net/Game_Events_(Source</a> <br /> С помощью функции <b>HookEvent</b> вы можете ловить любые нужные вам события, например <b>player_death</b> (смерть игрока), <b>round_start</b> (начало раунда) и др. Список всех событий и другую информацию можете найти <a class="link" href="/go?http://goo.gl/32Mzh" title="http://goo.gl/32Mzh" rel="nofollow" target="_blank"><span style="color:#980000"><b>здесь</b></span></a>. Без событий сделать какой-то скрипт просто не получится, так как команды могут быть выполнены только внутри функций, которые вызываются этими событиями. <br /><br /> Существуют и встроенные в <b>SourceMod</b> события, такие как <b>OnMapStart</b>, <b>OnPluginStart</b> и др (смотрите в <a class="link" href="/go?http://docs.sourcemod.net/api/" title="http://docs.sourcemod.net/api/" rel="nofollow" target="_blank">API</a>). Если событие должно отлавливаться постоянно, то обычно<b>HookEvent</b> используют в <b>OnPluginStart</b>, но это можно делать внутри любой функции. Если вы хотите прекратить отлавливать событие, то используйте функцию<b>UnhookEvent</b> (синтаксис такой же, как и в <b>HookEvent</b>). <br /><br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->HookEvent("имя события", <функция/блок для обработки события>, <метод>&#41;;<!--/uzc--></div></div><!--/uzcode--> <br /><br /> Есть три метода: <br /><br /> <b>EventHookMode_Pre</b> - вызываем функцию до того, как событие произошло <br /> <b>EventHookMode_Post</b> - после того, как оно произошло (по умолчанию) <br /> <b>EventHookMode_PostNoCopy</b> - после того, но без переменных <br /><br /> Пример скрипта, в начале раунда в чате напишет продолжительность раунда в секундах: <br /><br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->#include <sourcemod>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /> public OnPluginStart(&#41;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("round_start", round_start&#41;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /> public round_start(Handle:event, const String:name&#91;], bool:dontBroadcast&#41;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintToChatAll("timelimit = %d", GetEventInt(event, "timelimit"&#41;&#41;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> }<!--/uzc--></div></div><!--/uzcode--> <br /><br /> В событии <b>round_start</b> доступны три переменные: [ <b>timelimit, fraglimit, objective</b> ]. <br /> Список событий и переменных можете найти <a class="link" href="/go?http://goo.gl/blL5a" title="http://goo.gl/blL5a" rel="nofollow" target="_blank">здесь</a>. <br /><br /> Теперь посмотрим такой вариант: <br /><br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->#include <sourcemod>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /> public OnPluginStart(&#41;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("round_start", round_start, EventHookMode_PostNoCopy&#41;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /> public round_start(Handle:event, const String:name&#91;], bool:dontBroadcast&#41;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintToChatAll("timelimit = %d", GetEventInt(event, "timelimit"&#41;&#41;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> }<!--/uzc--></div></div><!--/uzcode--> <br /><br /> В этом случае мы не сможем получать переменные события, так как указан метод <b>EventHookMode_PostNoCopy</b>. Так делать полезно только в тех случаях, когда нам просто нужно знать, что событие произошло и не нужно получать его переменные. <br /><br /> Метод <b>EventHookMode_Pre</b>: <br /><br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->#include <sourcemod>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /> public OnPluginStart(&#41;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("round_start", round_start, EventHookMode_Pre&#41;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /> public Action:round_start(Handle:event, const String:name&#91;], bool:dontBroadcast&#41;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintToChatAll("timelimit = %d", GetEventInt(event, "timelimit"&#41;&#41;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Plugin_Continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> }<!--/uzc--></div></div><!--/uzcode--> <br /><br /> Блок 'public Action:round_start' выполнится до того, как начнется раунд, но здесь нужно не забывать добавлять приставку <b>Action:</b> и возвращать <b>return Plugin_Continue</b>(продолжить нормальное выполнение) или <b>return Plugin_Handled</b> (заблокировать). На сколько я знаю, сами события заблокировать нельзя, хотя, если вы это сделаете, то не будет никаких уведомлений о том, что оно произошло, например иконка смерти, сообщение о заходе игрока и тд. <br /><br /> Получать переменные событий можно с помощью данных команд: <br /><br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->GetEventBool - получить значение bool (true или false&#41;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> GetEventInt - целое число&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> GetEventFloat - с точкой&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> GetEventString - строка<!--/uzc--></div></div><!--/uzcode--> <br /><br /> Когда плагин отключается, SM сам делает все <b>UnhookEvent</b> и <b>CloseHandle</b>. Уроки SourceMod (SourcePawn) Скриптинга root /forum/6-14-1 Мини скрипты/плагины /forum/6-91-1 Fri, 12 Apr 2013 17:31:59 GMT Форум: <a href="/forum/6">Уроки SourceMod (SourcePawn) Скриптинга</a><br />Автор темы: root<br />Автор последнего сообщения: Admin<br />Количество ответов: 10 Если игрок жмет <b>F1</b>(<span style="color:#980000">автопокупка</span>), в чате пишется "<span style="color:#00ff00">guns</span>" от него. Хорошо для <span style="color:#00ffff">DeathMatch</span> <div class="smallfont" style="font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; background-color: rgb(245, 245, 255); margin-bottom: 2px;">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 6px; border: 1px inset; width: 800px; height: 194px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(255, 128, 0);">#include&nbsp;<sourcemod&gt;&nbsp;&nbsp;<br><br></span><span style="color: rgb(0, 119, 0);">public&nbsp;</span><span style="color: rgb(0, 0, 187);">OnPluginStart</span><span style="color: rgb(0, 119, 0);">()&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">RegConsoleCmd</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">"autobuy"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">autobuy</span><span style="color: rgb(0, 119, 0);">);&nbsp;&nbsp;<br>}&nbsp;&nbsp;<br><br>public&nbsp;</span><span style="color: rgb(0, 0, 187);">Action</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">autobuy</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">args</span><span style="color: rgb(0, 119, 0);">)&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">FakeClientCommand</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"say&nbsp;guns"</span><span style="color: rgb(0, 119, 0);">)&nbsp;&nbsp;<br>}</span></code></div> Уроки SourceMod (SourcePawn) Скриптинга root /forum/6-91-1 Создание меню в SourcePawn /forum/6-76-1 Tue, 26 Mar 2013 09:31:24 GMT Форум: <a href="/forum/6">Уроки SourceMod (SourcePawn) Скриптинга</a><br />Описание темы: http://forum.sn-project.ru/viewtopic.php?f=75&amp;t=2045<br />Автор темы: root<br />Автор последнего сообщения: Admin<br />Количество ответов: 2 <span style="font-weight: bold;"><span style="font-size: 16px; line-height: 18px;">Создание меню в SourcePawn</span></span><br><br>SourceMod имеет обширный API для создания и отображения меню клиентам.<br><br><span style="font-weight: bold;"><span style="font-size: 14px; line-height: 16px;">Стили</span></span><br>Объект верхнего уровня&nbsp;<span style="font-style: italic;">MenuStyle</span>&nbsp;(<span style="font-style: italic;">IMenuStyle в C++</span>). Есть два стиля отображения меню<br><ul><li><span style="font-style: italic;">Стиль Valve</span>&nbsp;- так называемое "ESC" меню; 8 элементов на странице</li><li><span style="font-style: italic;">Стиль Radio</span>&nbsp;- так называемое "AMX" меню; 10 элементов на странице</li></ul>Каждый&nbsp;<span style="font-style: italic;">MenuStyle</span>&nbsp;имеет свои собственные правила и свойства. Два разных меню могут существовать на экране игрока как Valve меню и Radio меню. В то же время, SourceMod будет в состоянии управлять этими меню. Это связано с тем, что каждый стиль отслеживает свое меню отдельно.<br><br><span style="font-weight: bold;"><span style="font-size: 14px; line-height: 16px;">Панели</span></span><br>Объект с более низким уровня интерфейсом&nbsp;<span style="font-style: italic;">Panels</span>&nbsp;(<span style="font-style: italic;">IMenuPanel в C++</span>). Панели позволяют сделать отображение, используя лишь только текст т.е. не используя выделительных пунктов (Select).&nbsp;<br>Панели отображаются временно. Хотя они могут быть сохранены на неопределенный срок, не рекомендуется это делать.<br><span style="font-weight: bold;">Стиль Valve</span><br><ul><li>Максимальное количество элементов на странице 8</li><li>Заблокированные элементы не могут быть осуществлены</li><li>Raw текст не может быть осуществлен</li><li>Осуществление между текстом пространства не добавят возможности добавить в панель больше символов</li><li>Клиент должен будет нажать кнопку "ESC" или, по крайней открыть консоль для просмотра меню</li></ul><span style="font-weight: bold;">Стиль Radio</span><br><ul><li>Максимальное количество элементов на странице 10</li><li>Оглавление белое, элементы желтые, но если их отключить, то они будут белыми</li><li>Элемент '0' всегда белый. Это означает, что навигационные кнопки управления всегда белого цвета</li></ul><br><span style="font-weight: bold;"><span style="font-size: 14px; line-height: 16px;">Меню</span></span><br>Есть простые&nbsp;<span style="font-style: italic;">Menu</span>&nbsp;(<span style="font-style: italic;">IBaseMenu в C++</span>). Эти вспомогательные объекты, предназначенные для хранения меню на основе выбора элементов. В отличие от низкого уровня панелей, меню могут содержать множество элементов, а также могут содержать только те пункты, которые выбираются (т. е. не содержат "белого" текста).&nbsp;<br>Они делятся на две категории:<br>Не пронумерованные - меню содержит в себе только лишь определенное количество элементов.&nbsp;<br>Нет пунктов навигации (Вперед; Назад). Исключение: Выход.<br><ul><span style="font-weight: bold;"><li>Назад (Previous) - Используется для возвращения просмотренных элементов; Перелистываемые страницы назад<br><ul><li><span style="font-style: italic;">Стиль Valve</span>: Позиция в меню: 6</li><li><span style="font-style: italic;">Стиль Radio</span>: Позиция в меню: 8</li></ul></li><li>Далее (Next) - Используется для просматривания следующих страниц; Перелистывание страницы вперед<br><ul><li><span style="font-style: italic;">Стиль Valve</span>: Позиция в меню: 7</li><li><span style="font-style: italic;">Стиль Radio</span>: Позиция в меню: 9</li></ul></li><li>Выход (Exit) - Используется для выхода из меню<br><ul><li><span style="font-style: italic;">Стиль Valve</span>: Позиция в меню: 8</li><li><span style="font-style: italic;">Стиль Radio</span>: Позиция в меню: 10</li></ul></li></span></ul><br><br>Цель меню - Упростить процедуру хранения и отображения информации. Таким образом, меню не позволяют добавить raw текст, так как это значительно усложняет отображение алгоритма.&nbsp;<br><span style="font-weight: bold;">Примечание</span>. C++ API поддерживает подключение&nbsp;<span style="font-style: italic;">IBaseMenu</span>&nbsp;процедуры отображения и добавления raw текста, это будет добавлено в сценарии API в ближайшее время.<br>Внутри меню отображение используется с помощью&nbsp;<span style="font-style: italic;">RenderMenu</span>&nbsp;алгоритма. Этот алгоритм создает временную панель и наполняет ее элементы из меню. Эта панель будет отображаться на клиенте. Алгоритм пытается создать свободное перемещение между всеми меню, и во всех стилях. Таким образом, любое меню отображается с помощью&nbsp;<span style="font-style: italic;">IBaseMenu</span>&nbsp;класса, или меню<span style="font-style: italic;">&nbsp;Handle</span>&nbsp;будет отображаться и использоваться так же как и меню&nbsp;<span style="font-style: italic;">Panel API</span>.<br><br><span style="font-size: 14px; line-height: 16px;"><span style="font-weight: bold;">Обзор</span></span><br>Меню являются системой обратного вызова. Каждый обратный вызов представляет собой действие, которое происходит во время всего цикла действия меню. Цикл состоит из некоторых уведомлений:<br><ul><li>Начало действия уведомлений<br><ul><li>Отображение уведомления клиенту</li><li>Выбор пункта в меню</li></ul></li><li>Конец действия уведомлений</li></ul><br><span style="font-size: 14px; line-height: 16px;"><span style="font-weight: bold;">Спецификация</span></span><br>Для C++,&nbsp;<span style="font-style: italic;">IBaseMenu</span>&nbsp;всегда доступен. Для SourcePawn,&nbsp;<span style="font-style: italic;">Menu Handle</span>&nbsp;и&nbsp;<span style="font-style: italic;">MenuAction</span>&nbsp;всегда устанавливаются в&nbsp;<span style="font-style: italic;">MenuHandler</span>&nbsp;обратного вызова. В отличие от C++, API позволяет SourcePawn выполнять определенные действия, если только меню было запрошено во время создания. Это оптимизация. Тем не менее, некоторые действия не могут быть предотвращены создания.<br><ul><span style="font-weight: bold;">Start</span>. Создание меню, причем&nbsp;<span style="font-style: italic;">OnMenuEnd</span>&nbsp;гарантированно будет вызываться.<br><ul><li><span style="font-style: italic;">MenuAction_Start()</span>&nbsp;в SourcePawn. Это действие не срабатывает при вызове.<br><ul><li>param1: Игнорирование. Всегда 0<br></li><li>param2: Игнорирование. Всегда 0</li></ul></li></ul><span style="font-weight: bold;">Display</span>. Отображение меню клиенту.<br><ul><li><span style="font-style: italic;">MenuAction_Display</span>&nbsp;в SourcePawn. Это действие не срабатывает при вызове.<br><ul><li>param1: Индекс клиента, которому показано меню</li><li>param2: Handle в меню</li></ul></li></ul><span style="font-weight: bold;">Select</span>. Выбор пункта меню.<br><ul><li><span style="font-style: italic;">MenuAction_Select</span>&nbsp;в SourcePawn. Это действие срабатывает, не смотря на вызов.<br><ul><li>param1: Индекс клиента, который выбрал пункт</li><li>param2: Индекс пункта, который выбрал клиент</li></ul></li></ul><span style="font-weight: bold;">Cancel</span>. Отмена показа меню<br><ul><li><span style="font-style: italic;">MenuAction_Cancel</span>&nbsp;в SourcePawn. Это действие срабатывает, не смотря на вызов.<br><ul><li>param1: Индекс клиента, который отменил показ меню</li><li>param2: Код причины отмены показа меню</li></ul></li></ul><span style="font-weight: bold;">End</span>. Окончание показа меню<br><ul><li><span style="font-style: italic;">MenuAction_End</span>&nbsp;в SourcePawn. Это действие всегда срабатывает, то ли просьба или нет.<br><ul><li>param1: Причина окончания показа меню</li><li>param2: Если&nbsp;<span style="font-style: italic;">param1</span>&nbsp;был&nbsp;<span style="font-style: italic;">MenuEnd_Cancelled</span>, это содержит причину отмены показа меню</li></ul></li></ul></ul><br><span style="font-weight: bold;"><span style="font-size: 14px; line-height: 16px;">Панели</span></span><br>Для панелей, функции обратного вызова всегда меняются. Для SourcePawn, Menu Handle всегда будет&nbsp;<span style="font-style: italic;">INVALID_HANDLE</span>.<br><span style="font-weight: bold;">Select</span>. Выбор пункта в панели<br><ul><li><span style="font-style: italic;">MenuAction_Select</span>&nbsp;в SourcePawn.<br><ul><li>param1: Индекс клиента, который выбрал пункт</li><li>param2: Индекс пункта, который выбрал клиент</li></ul></li></ul><span style="font-weight: bold;">Cancel</span>. Отмена показа панели<br><ul><li><span style="font-style: italic;">MenuAction_Cancel</span>&nbsp;в SourcePawn.<br><ul><li>param1: Индекс клиента, который отменил показ панели</li><li>param2: Код причины отмены показа панели</li></ul></li></ul><br><span style="font-size: 15px; line-height: 17px;"><span style="font-weight: bold;">Пример</span></span><br>Разберем создание панели и меню с вопросами<div><div class="smallfont">Код:</div><pre class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-size: 13px; margin-top: 0px; margin-bottom: 0px; padding: 2px; border: 1px inset; width: 800px; height: 66px; overflow: auto;">ваш вопрос 1. ответ 1 2. ответ 2</pre></div><div><br><span style="font-size: 14px; line-height: 16px;"><span style="font-weight: bold;">Меню</span></span><br><dl class="codebox"><dt><div class="smallfont">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 2px; border: 1px inset; width: 800px; height: 754px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(255, 128, 0);">//&nbsp;Подключаем&nbsp;библиотеки&nbsp;<br>#include&nbsp;<sourcemod&gt;&nbsp;<br><br>//&nbsp;Старт&nbsp;плагина&nbsp;<br></span><span style="color: rgb(0, 119, 0);">public&nbsp;</span><span style="color: rgb(0, 0, 187);">OnPluginStart</span><span style="color: rgb(0, 119, 0);">()&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;Регистрируем&nbsp;команду,&nbsp;введя&nbsp;которую&nbsp;нам&nbsp;отобразится&nbsp;меню<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">RegConsoleCmd</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">"menu"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">Menu</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>}&nbsp;<br><br></span><span style="color: rgb(255, 128, 0);">//&nbsp;Обрабатываем&nbsp;команду&nbsp;<br></span><span style="color: rgb(0, 119, 0);">public&nbsp;</span><span style="color: rgb(0, 0, 187);">Action</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">Menu</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">args</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;Создаем&nbsp;Handle&nbsp;меню&nbsp;<br>&nbsp;&nbsp;&nbsp;//&nbsp;MenuHandler&nbsp;-&nbsp;Значит&nbsp;что,&nbsp;нажав&nbsp;на&nbsp;один&nbsp;из&nbsp;пунктов,&nbsp;произойдет&nbsp;дальнейшее&nbsp;действие<br>&nbsp;&nbsp;&nbsp;//&nbsp;То&nbsp;есть,&nbsp;нажав&nbsp;к&nbsp;примеру&nbsp;на&nbsp;"Да",&nbsp;нам&nbsp;выведется&nbsp;в&nbsp;консоль&nbsp;о&nbsp;том,&nbsp;что&nbsp;вы&nbsp;выбрали&nbsp;именно&nbsp;этот&nbsp;пункт<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">Handle</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">menu&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">CreateMenu</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">MenuHandler</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">SetMenuTitle</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">menu</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"Вы&nbsp;любите&nbsp;Counter-Strike:Source?"</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">AddMenuItem</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">menu</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"yes"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"Да"</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">AddMenuItem</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">menu</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"no"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"Нет"</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">SetMenuExitButton</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">menu</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">false</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">DisplayMenu</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">menu</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">20</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: rgb(0, 0, 187);">Plugin_Handled&nbsp;<br></span><span style="color: rgb(0, 119, 0);">}&nbsp;<br><br>public&nbsp;</span><span style="color: rgb(0, 0, 187);">MenuHandler</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">Handle</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">menu</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">MenuAction</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">action</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">param1</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">param2</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">/*&nbsp;Если&nbsp;пункт&nbsp;меню&nbsp;был&nbsp;выбран,&nbsp;выводим&nbsp;в&nbsp;его&nbsp;консоль&nbsp;об&nbsp;этом&nbsp;*/<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">if&nbsp;(</span><span style="color: rgb(0, 0, 187);">action&nbsp;</span><span style="color: rgb(0, 119, 0);">==&nbsp;</span><span style="color: rgb(0, 0, 187);">MenuAction_Select</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">decl&nbsp;String</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">info</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">32</span><span style="color: rgb(0, 119, 0);">]&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;</span><span style="color: rgb(0, 0, 187);">bool</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">found&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">GetMenuItem</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">menu</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">param2</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">info</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">sizeof</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">info</span><span style="color: rgb(0, 119, 0);">))&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">PrintToConsole</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">param1</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"Вы&nbsp;выбрали&nbsp;пункт:&nbsp;%d&nbsp;(Найдено:&nbsp;%d&nbsp;Информация:&nbsp;%s)"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">param2</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">found</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">info</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;}&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">/*&nbsp;Если&nbsp;клиент&nbsp;отменил&nbsp;показ&nbsp;меню,&nbsp;выводим&nbsp;в&nbsp;консоль&nbsp;сервера&nbsp;*/<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">else&nbsp;if&nbsp;(</span><span style="color: rgb(0, 0, 187);">action&nbsp;</span><span style="color: rgb(0, 119, 0);">==&nbsp;</span><span style="color: rgb(0, 0, 187);">MenuAction_Cancel</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">PrintToServer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">"Клиент&nbsp;%d&nbsp;Отменил&nbsp;показ&nbsp;меню.&nbsp;&nbsp;Причина:&nbsp;%d"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">param1</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">param2</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;}&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">/*&nbsp;Если&nbsp;показ&nbsp;меню&nbsp;закончился,&nbsp;закрываем&nbsp;Handle&nbsp;*/<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">else&nbsp;if&nbsp;(</span><span style="color: rgb(0, 0, 187);">action&nbsp;</span><span style="color: rgb(0, 119, 0);">==&nbsp;</span><span style="color: rgb(0, 0, 187);">MenuAction_End</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">CloseHandle</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">menu</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;}&nbsp;<br>}</span></code></div></dt></dl>Обратите внимание на несколько очень важных примечаний<br><ul><li>Один из пунктов&nbsp;<span style="font-style: italic;">Select</span>&nbsp;или&nbsp;<span style="font-style: italic;">Cancel</span>&nbsp;будет направлен в действие обрабатывания меню</li><li>Пункт&nbsp;<span style="font-style: italic;">End</span>&nbsp;всегда будет направлен в действие обрабатывания меню</li><li>Уничтожение меню следует производить только, если клиент отменил меню, или оно закончилось</li><li>В меню, по умолчанию, есть пункт выхода</li><li>Продолжительно показа меню зависит от DisplayMenu</li></ul></div> Уроки SourceMod (SourcePawn) Скриптинга root /forum/6-76-1 Введение в SourcePawn программирование /forum/6-81-1 Tue, 26 Mar 2013 08:36:53 GMT Форум: <a href="/forum/6">Уроки SourceMod (SourcePawn) Скриптинга</a><br />Автор темы: root<br />Автор последнего сообщения: Admin<br />Количество ответов: 5 <span style="font-family: 'Times New Roman'; font-size: medium; font-weight: bold;"><span style="font-size: 24px; line-height: 27px;">Введение в SourcePawn программирование</span></span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Это руководство призвано дать вам самые основные представления по написанию сприптов в SourcePawn.</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: medium; font-weight: bold;">Pawn</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: medium;">- это "скриптовый" язык используемый для внедрения функциональности в других программах. Это означает, что это не самостоятельный язык, как C++ или Java, и его элементы будут отличаться в различных приложениях.</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: medium; font-weight: bold;">SourcePawn</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: medium;">- это вариация языка Pawn, используемая в SourceMod.</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Это руководство не расскажет вам, как писать SourceMod плагины; оно предназначено для получения общих представлений о синтаксисе и семантике этого языка.</span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: 24px; line-height: 27px;"><span style="font-weight: bold;">Особенности языка</span></span><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Pawn может показаться очень похожим на другие языки программирования, например C, но Pawn от них фундаментально отличается. Не столь важно, чтобы вы сейчас же поняли его отличия, но они понадобятся, если вы уже знаете один из языков программирования:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><ul style="font-family: 'Times New Roman'; font-size: medium;"><li>Pawn не собирает мусор</li><li>Pawn, как язык, не имеет встроенных ресурсов памяти, и потому он не мусорит. Если функция выделит память, то вы отвечаете за её освобождение.</li><li>Pawn не объектно-ориентированный язык</li><li>Pawn является процедурным и полагается на подпрограммы. Также у него нету C подобных структур.</li><li>Pawn не функциональный</li><li>awn является процедурным и не поддерживает функции "лямбды" (Lambda), поздние присвоения и все то, что можно найти в языках высшего уровня, таких как Python и Ruby.</li><li>Pawn однопоточный</li><li>Pawn не интерпретируемый<br>Ну, почти. Он интерпретируется на очень низком уровне. Вы должны скомпилировать код, из которого получится бинарный файл. Эта программа будет работать на той платформе, которую использует сервер. Это ускоряет загрузку и позволяет легче находить ошибки.</li></ul><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Этот язык был выпущен ITB CompuPhase. Язык разработан для устройств низкого уровня и таким образом конечные программы очень маленькие по размеру и очень быстрые.</span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: 24px; line-height: 27px;"><span style="font-weight: bold;">Идентификаторы/ключевые слова</span></span><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Идентификаторы представляет собой набор букв, цифр и/или нижнего подчеркивания, что представляет собой нечто уникальное. Идентификаторы вводятся с учетом регистра (в отличие от PHP, где иногда это не требуется). Идентификаторы не начинаются с какого-либо специального символа, но они должны начинаться с буквы.</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Есть несколько зарезервированных символов, которые имеют особое значение. Например,</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: medium; font-style: italic;">if</span><span style="font-family: 'Times New Roman'; font-size: medium;">,</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: medium; font-style: italic;">for</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: medium;">и</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: medium; font-style: italic;">return</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: medium;">специальные конструкции в языке, которые будут описаны позднее. Они не могут быть использованы в качестве названий идентификаторов.</span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: 24px; line-height: 27px;"><span style="font-weight: bold;">Переменные</span></span><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Существует несколько важных конструкций, которые вы должны знать, прежде чем приступить к написанию сценария. Во-первых, это</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: medium; font-weight: bold;">переменные</span><span style="font-family: 'Times New Roman'; font-size: medium;">. Переменная - это идентификатор, который содержит данные. Например, переменная "a" может содержать числа "2", "16", "0" и так далее. Переменные создаются для хранения данных внутри программы. Переменные должны быть объявлены до их использования, с помощью ключевого слова "</span><span style="font-family: 'Times New Roman'; font-size: medium; font-weight: bold;">new</span><span style="font-family: 'Times New Roman'; font-size: medium;">". Данные можно присвоить переменной, используя знак равенства (</span><span style="font-family: 'Times New Roman'; font-size: medium; font-weight: bold;">=</span><span style="font-family: 'Times New Roman'; font-size: medium;">). Пример:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><dt><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">a</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">b</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">c</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">d</span><span style="color: rgb(0, 119, 0);">;<br>&nbsp;<br></span><span style="color: rgb(0, 0, 187);">a&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">b&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">16</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">c&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">0</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">d&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">500</span><span style="color: rgb(0, 119, 0);">;</span></code></div></dt></dl><span style="font-family: 'Times New Roman'; font-size: medium;">В SourcePawn, переменные бывают двух типов:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><ul style="font-family: 'Times New Roman'; font-size: medium;"><li>Однострочные (могут содержать только произвольные числовые данные), как показано выше</li><li>Многострочные (могут содержать целый ряд текстовых символов)</li></ul><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Однострочные могут содержать 32 бита цифровых данных. Многострочные - последовательный список из UTF-8 символов. Однострочные не имеет своего типа, однако они могут быть маркированы(tagged). Тег позволяет вам указывать, где определенную ячейку можно использовать. Типичные теги:</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><br style="font-family: 'Times New Roman'; font-size: medium;"><ul style="font-family: 'Times New Roman'; font-size: medium;"><li>(пусто), или&nbsp;<span style="font-style: italic;">_</span>&nbsp;- Нет тега. Обычно используют для целых чисел (Integers).</li><li><span style="font-weight: bold;">Float</span>&nbsp;- используют для чисел с плавающей точкой (небольших).</li><li><span style="font-weight: bold;">bool</span>&nbsp;- используют для хранения значений true (истина) или false (ложь).</li></ul><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Со строками все по другому, они будут рассмотрены далее.</span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: 24px; line-height: 27px;"><span style="font-weight: bold;">Объявления</span></span><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Примеры разных правильных объявлений переменных:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><dt><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">a&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">;<br>new&nbsp;</span><span style="color: rgb(0, 0, 187);">Float</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">b&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">5.0</span><span style="color: rgb(0, 119, 0);">;<br>new&nbsp;</span><span style="color: rgb(0, 0, 187);">bool</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">c&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">true</span><span style="color: rgb(0, 119, 0);">;<br>new&nbsp;</span><span style="color: rgb(0, 0, 187);">bool</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">d&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">0</span><span style="color: rgb(0, 119, 0);">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;работает,&nbsp;поскольку&nbsp;0&nbsp;равно&nbsp;false&nbsp;(ложь)</span></code></div></dt></dl><span style="font-family: 'Times New Roman'; font-size: medium;">Неправильные объявления переменных:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><dt><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">a&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">5.0</span><span style="color: rgb(0, 119, 0);">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;несоответствие&nbsp;тегов.&nbsp;5.0&nbsp;должо&nbsp;быть&nbsp;с&nbsp;тегом&nbsp;Float<br></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">Float</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">b&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;несоответствие&nbsp;тегов.&nbsp;5&nbsp;должно&nbsp;быть&nbsp;без&nbsp;тега.</span></code></div></dt></dl><span style="font-family: 'Times New Roman'; font-size: medium;">Если переменная не определена в объявлении, то ее значение станет 0:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">a</span><span style="color: rgb(0, 119, 0);">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;значение&nbsp;0<br></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">Float</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">b</span><span style="color: rgb(0, 119, 0);">;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;значение&nbsp;0.0<br></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">bool</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">c</span><span style="color: rgb(0, 119, 0);">;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;значение&nbsp;false</span></code></div><dt><span style="font-weight: bold; font-size: 24px; line-height: 27px;">Присвоение</span></dt></dl><span style="font-family: 'Times New Roman'; font-size: medium;">Переменным могут быть присвоены данные после создания. Пример:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><dt><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">a</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">Float</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">b</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">bool</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">c</span><span style="color: rgb(0, 119, 0);">;<br>&nbsp;<br></span><span style="color: rgb(0, 0, 187);">a&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">b&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">5.0</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">c&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">true</span><span style="color: rgb(0, 119, 0);">;</span></code></div></dt></dl><span style="font-family: 'Times New Roman'; font-size: 24px; line-height: 27px;"><span style="font-weight: bold;">Комментарии</span></span><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Примечания и любой текст, который пишется после "</span><span style="font-family: 'Times New Roman'; font-size: medium; font-weight: bold;">//</span><span style="font-family: 'Times New Roman'; font-size: medium;">" считается "комментарием", а не фактическим кодом. Есть два стиля комментариев:</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><br style="font-family: 'Times New Roman'; font-size: medium;"><ul style="font-family: 'Times New Roman'; font-size: medium;"><li>// - двойная косая черта, всё, следующее после этой строки, игнорируется</li><li>/* */ - много-строчный комментарий, весь текст, внутри звездочек, игнорируются</li></ul><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: 24px; line-height: 27px;"><span style="font-weight: bold;">Массивы</span></span><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Вы можете группировать код в виде "массивов", разделенных { и }. Это фактически создает возможность работать с целым массивом как с одним оператором. Например:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">{<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">здесь</span><span style="color: rgb(0, 119, 0);">;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">какой</span><span style="color: rgb(0, 119, 0);">-</span><span style="color: rgb(0, 0, 187);">то</span><span style="color: rgb(0, 119, 0);">;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">код</span><span style="color: rgb(0, 119, 0);">;<br>}</span></code></div><dt><br></dt><dt>Массивы с фигурными скобками используются достаточно широко в программировании. Массивы кода могут быть вложенными друг в друга. Это хорошая возможность адаптировать последовательность кода и сделать его удобочитаемым, благодаря отступам код не будет смотреться, как одна большая и длинная макаронина.</dt></dl><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Массив объявляется с помощью квадратных скобок. Вот некоторые примеры массивов:</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><dt><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">players</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">32</span><span style="color: rgb(0, 119, 0);">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;Набор&nbsp;из&nbsp;32&nbsp;однострочных&nbsp;(числовых)&nbsp;данных<br></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">Float</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">origin</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">3</span><span style="color: rgb(0, 119, 0);">];&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;Набор&nbsp;из&nbsp;3&nbsp;чисел&nbsp;с&nbsp;плавающей&nbsp;точкой</span></code></div></dt></dl><span style="font-family: 'Times New Roman'; font-size: medium;">По умолчанию, массивам присваиваются нули. Вы можете присвоить им разные значения, однако:</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><dt><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;{</span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">2</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">3</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">4</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;В&nbsp;numbers&nbsp;будут&nbsp;храниться&nbsp;значения&nbsp;1,&nbsp;2,&nbsp;3,&nbsp;4&nbsp;,5<br></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">Float</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">origin</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">3</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;{</span><span style="color: rgb(0, 0, 187);">1.0</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">2.0</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">3.0</span><span style="color: rgb(0, 119, 0);">};&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;В&nbsp;origin&nbsp;будут&nbsp;храниться&nbsp;значения&nbsp;1.0,&nbsp;2.0,&nbsp;3.0</span></code></div></dt></dl><span style="font-family: 'Times New Roman'; font-size: medium;">Вы можете оставить массив без размера, если вы собираетесь заранее присвоить ему данные. Например:</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><dt><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[]&nbsp;=&nbsp;{</span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">3</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">7</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">9</span><span style="color: rgb(0, 119, 0);">};</span></code></div></dt></dl><span style="font-family: 'Times New Roman'; font-size: medium;">Компилятор будет автоматически делать вывод о том, что вы хотите получить массив размером 5.</span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Использование массива равносильно использованию обычной переменной. Единственное отличие состоит в том, что он должен быть индексируемым. Индексирование массива означает присутствие возможности выбрать элемент, который вы хотите использовать.</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Вот пример кода с использованием индексов:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><dt><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">],&nbsp;</span><span style="color: rgb(0, 0, 187);">Float</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">origin</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">3</span><span style="color: rgb(0, 119, 0);">];<br>&nbsp;<br></span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">0</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">2</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">2</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">3</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">3</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">4</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">4</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">origin</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">0</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">1.0</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">origin</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">2.0</span><span style="color: rgb(0, 119, 0);">;<br></span><span style="color: rgb(0, 0, 187);">origin</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">2</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">3.0</span><span style="color: rgb(0, 119, 0);">;</span></code></div></dt></dl><span style="font-family: 'Times New Roman'; font-size: medium;">Заметим, что индекс это текст, который находится в квадратных скобках. Индекс всегда начинается с нуля. То есть, если массив имеет N элементов, его действительный индекс от 0 до N-1. Доступ к данным с индексами работает так же, как с обычной переменной.</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Использование неверного индекса вызовет ошибку. Например:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><dt><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">];<br>&nbsp;<br></span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">20</span><span style="color: rgb(0, 119, 0);">;</span></code></div></dt></dl><span style="font-family: 'Times New Roman'; font-size: medium;">Это может выглядеть верно, но число 5 не является допустимым индексом. Наибольшим значением индекса является число 4.</span><span style="font-family: 'Times New Roman'; font-size: medium;">&nbsp;</span><br style="font-family: 'Times New Roman'; font-size: medium;"><br style="font-family: 'Times New Roman'; font-size: medium;"><span style="font-family: 'Times New Roman'; font-size: medium;">Вы можете использовать любые выражения, как индекс. Например:</span><br style="font-family: 'Times New Roman'; font-size: medium;"><dl class="codebox" style="font-family: 'Times New Roman'; font-size: medium;"><dt><div class="smallfont"><font size="1" style="font-size: 8pt;">PHP код:</font></div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 11px; margin: 0px; padding: 5px; border: 1px inset; width: 800px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">a</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">];<br>&nbsp;<br></span><span style="color: rgb(0, 0, 187);">a&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;сделает&nbsp;a&nbsp;=&nbsp;1<br></span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">a</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">4</span><span style="color: rgb(0, 119, 0);">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;сделает&nbsp;numbers[1]&nbsp;=&nbsp;4<br></span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">numbers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">a</span><span style="color: rgb(0, 119, 0);">]]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">2</span><span style="color: rgb(0, 119, 0);">;&nbsp;</span><span style="color: rgb(255, 128, 0);">//&nbsp;сделает&nbsp;numbers[4]&nbsp;=&nbsp;2</span></code></div><div><code style="white-space: nowrap;"><span style="color: rgb(255, 128, 0);"><br></span></code></div></dt></dl><span style="font-family: 'Times New Roman'; font-size: 24px; line-height: 27px;"></span> Уроки SourceMod (SourcePawn) Скриптинга root /forum/6-81-1 Цвет сообщений в чате /forum/6-34-1 Fri, 01 Mar 2013 08:55:45 GMT Форум: <a href="/forum/6">Уроки SourceMod (SourcePawn) Скриптинга</a><br />Описание темы: Часть информации с world-source.ru<br />Автор темы: root<br />Автор последнего сообщения: Admin<br />Количество ответов: 2 Как сделать сообщения разноцветными. <br /><br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->&#92;x01 - default (стандартный оранжевый этот&#41;&nbsp;&nbsp;&nbsp;<br /> &#92;x03 - lightgreen/red/blue/grey (grey, если игрок в spec&#41;&nbsp;&nbsp;&nbsp;<br /> &#92;x04 - green (зеленый&#41;&nbsp;&nbsp;&nbsp;<br /> &#92;x05 - darkgreen (темно-зеленый&#41;<!--/uzc--></div></div><!--/uzcode--> <br /><br /> Вот скрипт для теста: <br /><br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->#include <sourcemod>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /> public OnPluginStart(&#41;&nbsp;&nbsp;&nbsp;<br /> {&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("player_say", Say&#41;;&nbsp;&nbsp;&nbsp;<br /> }&nbsp;&nbsp;&nbsp;<br /><br /> public Say(Handle:event, const String:name&#91;], bool:dontBroadcast&#41;&nbsp;&nbsp;&nbsp;<br /> {&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new i = GetClientOfUserId(GetEventInt(event, "userid"&#41;&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decl String:text&#91;5];&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetEventString(event, "text", text, sizeof(text&#41;&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (StrEqual(text, "1"&#41;&#41;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintToChatAll("&#92;x01...01"&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintToChatAll("&#92;x03...03"&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintToChatAll("&#92;x04...04"&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintToChatAll("&#92;x05...05"&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintToChatAll("&#92;x05...05&#92;x04...04&#92;x03...03&#92;x01...01"&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (StrEqual(text, "2"&#41;&#41;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Handle:h = StartMessageAll("SayText2"&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (h != INVALID_HANDLE&#41;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BfWriteByte(h, i&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BfWriteByte(h, true&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BfWriteString(h, "&#92;x03Цветное &#92;x04сообщение"&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndMessage(&#41;;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br /> }<!--/uzc--></div></div><!--/uzcode--> <br /><br /> Результат: <br /><br /> <img src="http://world-source.ru/img/sm_colors.jpg" border="0" alt=""/> <br /><br /> Чтобы получить синий, красный, или серый цвет, используйте функцию <span style="color:#0000ff">StartMessageAll</span>("SayText2"); - сообщение для всех, или <span style="color:#0000ff">StartMessageOne</span>("SayText2", client); - для одного игрока. В первой строке BfWriteByte(h, <span style="color:#ff0000">i</span>); - i это индекс игрока. Цвет сообщения зависит от команды, в которой он находится. Если он CT - сообщение будет синим, T - красным, SPEC - серым. Уроки SourceMod (SourcePawn) Скриптинга root /forum/6-34-1 Таймеры в SourcePawn /forum/6-82-1 Sun, 03 Feb 2013 05:03:54 GMT Форум: <a href="/forum/6">Уроки SourceMod (SourcePawn) Скриптинга</a><br />Автор темы: root<br />Автор последнего сообщения: Admin<br />Количество ответов: 0 <span style="font-weight: bold;"><span style="font-size: 16px; line-height: 18px;">Таймеры в SourcePawn</span></span><br><br><span style="font-weight: bold;"><span style="font-size: 16px; line-height: 18px;">Введение</span></span><br>Таймер позволяет задать интервал, после окончания которого можно будет выполнить определенную функцию.<br>Все функции таймера можно посмотреть в файле timers.inc (scripting/include)<br><br><span style="font-weight: bold;"><span style="font-size: 16px; line-height: 18px;">Основы использования</span></span><br><br><span style="font-weight: bold;">Одноразовые таймеры</span><br>Данный таймер будет выполняться 1 раз<br><dl class="codebox"><dt><div class="smallfont">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 2px; border: 1px inset; width: 430px; height: 162px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">public&nbsp;</span><span style="color: rgb(0, 0, 187);">OnPluginStart</span><span style="color: rgb(0, 119, 0);">()&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">CreateTimer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">5.0</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">LoadStuff</span><span style="color: rgb(0, 119, 0);">);&nbsp;<br>}&nbsp;<br>&nbsp;&nbsp;<br>public&nbsp;</span><span style="color: rgb(0, 0, 187);">Action</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">LoadStuff</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">Handle</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">timer</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">PrintToServer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">"Loading&nbsp;stuff!"</span><span style="color: rgb(0, 119, 0);">);&nbsp;<br>}</span></code></div></dt></dl>Данный код будет писать в консоль сервера&nbsp;<span style="font-weight: bold;">Loading stuff!</span>, по прошествии 5 секунд<br><br><span style="font-weight: bold;">Повторяющиеся таймеры</span><br>Повторяющиеся таймеры могут выполняться бесконечное число раз через определенный промежуток времени<br>Например, отобразим сообщение пять раз через интервал равный трем секундам<br><dl class="codebox"><dt><div class="smallfont">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 2px; border: 1px inset; width: 430px; height: 306px; overflow: auto;"><code style="white-space: nowrap;"><code><span style="color: rgb(0, 0, 187);">DoMessage</span><span style="color: rgb(0, 119, 0);">()&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">CreateTimer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">3.0</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">PrintMsg</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">_</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">TIMER_REPEAT</span><span style="color: rgb(0, 119, 0);">);&nbsp;<br>}&nbsp;<br>&nbsp;&nbsp;<br>public&nbsp;</span><span style="color: rgb(0, 0, 187);">Action</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">PrintMsg</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">Handle</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">timer</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;static&nbsp;</span><span style="color: rgb(0, 0, 187);">NumPrinted&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">0&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">if&nbsp;(</span><span style="color: rgb(0, 0, 187);">NumPrinted</span><span style="color: rgb(0, 119, 0);">++&nbsp;&gt;=&nbsp;</span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">PrintToServer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">"Warning!&nbsp;This&nbsp;is&nbsp;a&nbsp;message."</span><span style="color: rgb(0, 119, 0);">);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">NumPrinted&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">0&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">return&nbsp;</span><span style="color: rgb(0, 0, 187);">Plugin_Stop&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">}&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: rgb(0, 0, 187);">Plugin_Continue&nbsp;<br></span><span style="color: rgb(0, 119, 0);">}</span></code></code></div></dt></dl><span style="font-weight: bold;">Plugin_Stop</span>&nbsp;останавливает таймер, а&nbsp;<span style="font-weight: bold;">PLUGIN_CONTINUE</span>&nbsp;позволяет ему продолжать работать<br><br><br><span style="font-weight: bold;"><span style="font-size: 16px; line-height: 18px;">Передача данных</span></span><br><br><span style="font-weight: bold;">Простые значения</span><br>Таймеры способны передавать значения в функцию обратного вызова. Это значение может быть любого типа.<br>Например, покажем сообщение игроку через 15 секунд после подключения на сервер<br><dl class="codebox"><dt><div class="smallfont">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 2px; border: 1px inset; width: 430px; height: 386px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(255, 128, 0);">#define&nbsp;MAX_PLAYERS&nbsp;256&nbsp;<br>&nbsp;&nbsp;<br></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">Handle</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">MAX_PLAYERS</span><span style="color: rgb(0, 119, 0);">+</span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">]&nbsp;<br>&nbsp;&nbsp;<br>public&nbsp;</span><span style="color: rgb(0, 0, 187);">OnClientPutInServer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">CreateTimer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">15.0</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">WelcomePlayer</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">);&nbsp;<br>}&nbsp;<br>&nbsp;&nbsp;<br>public&nbsp;</span><span style="color: rgb(0, 0, 187);">OnClientDisconnect</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: rgb(0, 0, 187);">WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">]&nbsp;!=&nbsp;</span><span style="color: rgb(0, 0, 187);">INVALID_HANDLE</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">KillTimer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">]);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">INVALID_HANDLE&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">}&nbsp;<br>}&nbsp;<br>&nbsp;&nbsp;<br>public&nbsp;</span><span style="color: rgb(0, 0, 187);">Action</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">WelcomePlayer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">Handle</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">timer</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">any</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">PrintToConsole</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"Welcome&nbsp;to&nbsp;the&nbsp;server!"</span><span style="color: rgb(0, 119, 0);">);</span></code></div></dt></dl><span style="font-weight: bold;">Пакеты данных</span><br><br>Пакеты данных&nbsp;<span style="font-weight: bold;">Packable</span>&nbsp;структур, которые могут быть использованы для проведения асинхронных данных (данные, которые должны быть сохранены и без упаковки позже). Они особенно полезны для таймеров. Следовательно, существует вспомогательная функция, называемая&nbsp;<span style="font-weight: bold;">CreateDataTimer ()</span>, которая создает таймер с помощью дескриптора данных пакета. Handle создается и закрывается автоматически.<br><br>Приведенный выше пример был переписан так:<br><dl class="codebox"><dt><div class="smallfont">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 2px; border: 1px inset; width: 430px; height: 562px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(255, 128, 0);">#define&nbsp;MAX_PLAYERS&nbsp;256&nbsp;<br>&nbsp;&nbsp;<br></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">Handle</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">MAX_PLAYERS</span><span style="color: rgb(0, 119, 0);">+</span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">]&nbsp;<br>&nbsp;&nbsp;<br>public&nbsp;</span><span style="color: rgb(0, 0, 187);">OnClientPutInServer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;new&nbsp;</span><span style="color: rgb(0, 0, 187);">Handle</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">pack&nbsp;<br>&nbsp;&nbsp;&nbsp;WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">CreateDataTimer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">15.0</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">WelcomePlayer</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">pack</span><span style="color: rgb(0, 119, 0);">);&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">WritePackCell</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">pack</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">);&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">WritePackString</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">pack</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"Welcome&nbsp;to&nbsp;the&nbsp;server!"</span><span style="color: rgb(0, 119, 0);">);&nbsp;<br>}&nbsp;<br>&nbsp;&nbsp;<br>public&nbsp;</span><span style="color: rgb(0, 0, 187);">OnClientDisconnect</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: rgb(0, 0, 187);">WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">]&nbsp;!=&nbsp;</span><span style="color: rgb(0, 0, 187);">INVALID_HANDLE</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">KillTimer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">]);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">INVALID_HANDLE&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">}&nbsp;<br>}&nbsp;<br>&nbsp;&nbsp;<br>public&nbsp;</span><span style="color: rgb(0, 0, 187);">Action</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">WelcomePlayer</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">Handle</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">timer</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">Handle</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">pack</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">decl&nbsp;String</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">str</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">128</span><span style="color: rgb(0, 119, 0);">]&nbsp;<br>&nbsp;&nbsp;&nbsp;new&nbsp;</span><span style="color: rgb(0, 0, 187);">client&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">/*&nbsp;Set&nbsp;to&nbsp;the&nbsp;beginning&nbsp;and&nbsp;unpack&nbsp;it&nbsp;*/&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">ResetPack</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">pack</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">client&nbsp;</span><span style="color: rgb(0, 119, 0);">=&nbsp;</span><span style="color: rgb(0, 0, 187);">ReadPackCell</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">pack</span><span style="color: rgb(0, 119, 0);">)&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">ReadPackString</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">pack</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">str</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">sizeof</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">str</span><span style="color: rgb(0, 119, 0);">));&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">PrintToConsole</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"%s"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">str</span><span style="color: rgb(0, 119, 0);">);&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 187);">WelcomeTimers</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">]&nbsp;=&nbsp;</span><span style="color: rgb(0, 0, 187);">INVALID_HANDLE&nbsp;<br></span><span style="color: rgb(0, 119, 0);">}</span></code></div></dt></dl><span style="font-weight: bold;"><span style="font-size: 16px; line-height: 18px;">Примечания</span></span><br><br><span style="font-weight: bold;">Точность</span><br>Наименьший возможный интервал 0,1 секунды. Таймер имеют высокую точность (с плавающей запятой), но низкую точность, как текущее время на сервере.&nbsp;<br>Это имеет два последствия:<br><ul><li>Если сервер стоит на паузе - таймер не будет работать.</li><li>Сервер не всегда будет повторять все в точном интервале</li></ul><br><span style="font-weight: bold;"><span style="font-size: 16px; line-height: 18px;">Смерть таймера</span></span><br>Все таймеры гарантированно будут убиты, когда:<br><ul><li>Используется&nbsp;<span style="font-weight: bold;">CloseHandle ()</span>;</li><li>Используется&nbsp;<span style="font-weight: bold;">KillTimer ()</span>;</li><li>Используется&nbsp;<span style="font-weight: bold;">Plugin_Stop</span>&nbsp;в повторяющихся таймерах;</li><li>Используется&nbsp;<span style="font-weight: bold;">TriggerTimer ()</span>&nbsp;в одноразовых таймерах;</li><li>Исполняется одноразовый таймер</li></ul>При смерти таймера, если&nbsp;<span style="font-weight: bold;">TIMER_HNDL_CLOSE</span>&nbsp;установлено, то Handle будут закрыты с разрешениями,&nbsp;<span style="font-weight: bold;">CloseHandle ()</span>&nbsp;используется по умолчанию. Так как таймер не может быть клонирован.<br><br><a href="http://wiki.alliedmods.net/Ru:Timers_(SourceMod_Scripting)#Handles" class="postlink"><span style="font-weight: bold; color: rgb(0, 0, 205);">Оригинал</span></a> Уроки SourceMod (SourcePawn) Скриптинга root /forum/6-82-1 Файлы перевода в SourcePawn /forum/6-80-1 Sun, 03 Feb 2013 04:47:29 GMT Форум: <a href="/forum/6">Уроки SourceMod (SourcePawn) Скриптинга</a><br />Автор темы: root<br />Автор последнего сообщения: Admin<br />Количество ответов: 0 <span style="font-weight: bold;"><span style="font-size: 16px; line-height: 18px;">Введение</span></span><br><br>Система SourceMod ML базируется на следующих терминах:<br><br><ul><li><span style="font-weight: bold;">Языки:</span>&nbsp;Предварительно заданные языки перевода устанавливаются в configs&#92;languages.cfg. Если язык перевода отсутствует в этом файле, он не может быть переведен до тех пор, пока не будет добавлен в этот файл и обновлена кэш-память переводов.</li><li><span style="font-weight: bold;">Фразы/Ключи перевода:</span>&nbsp;Короткие, общие ключевые фразы, используемые для определения набора переводов. Они находятся в конфигурационных файлах в папке translations. Они называются файлы перевода.</li><li><span style="font-weight: bold;">Переводы:</span>&nbsp;Содержат фразы текста перевода для данного языка. Они находятся в файлах перевода.</li></ul><span style="font-weight: bold;">Примечание:</span>&nbsp;Переводы и Фразы чувствительны к регистру.<br><br><br><span style="font-weight: bold;"><span style="font-size: 16px; line-height: 18px;">Формат файла</span></span><br><br>Многоязычный формат файлов перевода содержится в стандартной конфигурационной форме от Valve. Она состоит из одного главного раздела, "Phrases", который содержит любое число имен подразделов. Каждый подраздел определяется одним именем Фразы, и не могут иметь в себе подразделы. Они обладают следующими свойствами:<br><ul><li><span style="font-weight: bold;">Ключ:</span>&nbsp;"#format"<br><ul><li><span style="font-weight: bold;">Значение:</span>&nbsp;Разделенные запятыми, пары индексов и форматов</li></ul><br></li><li><span style="font-weight: bold;">Ключ:</span>&nbsp;Двух символьный код языка.<br><ul><li><span style="font-weight: bold;">Значение:</span>&nbsp;Языковой перевод строки.</li></ul></li></ul><br><span style="font-weight: bold;">Пример:</span><br><dl class="codebox"><dt><div class="smallfont">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 2px; border: 1px inset; width: 430px; height: 146px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(221, 0, 0);">"Phrases"&nbsp;<br></span><span style="color: rgb(0, 119, 0);">{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(221, 0, 0);">"Welcome"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(221, 0, 0);">"en"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Welcome&nbsp;to&nbsp;SourceMod"&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ru"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Добро&nbsp;пожаловать&nbsp;в&nbsp;SourceMod"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">}&nbsp;<br>}</span></code></div></dt></dl><br>В приведенном выше примере, два перевода определяется по имени фразы "Welcome" - одна для английского, и одна для русского языка. Вместе с тем, рассмотрим фразу, которая может вставлять определенные слова, как в этом примере:<br><dl class="codebox"><dt><div class="smallfont">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 2px; border: 1px inset; width: 430px; height: 242px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(221, 0, 0);">"Phrases"&nbsp;<br></span><span style="color: rgb(0, 119, 0);">{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(221, 0, 0);">"Pants"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(221, 0, 0);">"en"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"pants"&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ru"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"трусы"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">}&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//НЕПРАВИЛЬНЫЙ&nbsp;ПРИМЕР:&nbsp;"Frenzzy&nbsp;трусы&nbsp;горят!"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(221, 0, 0);">"OnFire_plural"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(221, 0, 0);">"en"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"%s's&nbsp;%s&nbsp;are&nbsp;on&nbsp;fire!"&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ru"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"%s&nbsp;%s&nbsp;горят!"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">}&nbsp;<br>}</span></code></div></dt></dl>В приведенном Выше примере, порядок слов изменился. Фраза на английском вставляет объект первым, а фраза на русском предписывает объект вторым. На русском языке фраза должна выглядеть следующим образом: Трусы Frenzzy горят!. Это создает проблему для скриптов, которые всегда просматривают формат параметров в одном порядке. Чтобы решить эту проблему, было введено свойство #format. Оно предопределяет порядок формата параметров.<br><br><span style="font-weight: bold;">Пример:</span><br><dl class="codebox"><dt><div class="smallfont">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 2px; border: 1px inset; width: 430px; height: 290px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(221, 0, 0);">"Phrases"&nbsp;<br></span><span style="color: rgb(0, 119, 0);">{&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//Пример:&nbsp;"Трусы&nbsp;Frenzzy&nbsp;горят!"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(221, 0, 0);">"OnFire_plural"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(221, 0, 0);">"#format"&nbsp;&nbsp;&nbsp;"{1:s},{2:s}"&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"en"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"{1}'s&nbsp;{2}&nbsp;are&nbsp;on&nbsp;fire!"&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ru"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"{2}&nbsp;{1}&nbsp;горят!"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">}&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255, 128, 0);">//Пример:&nbsp;"Привет,&nbsp;Frenzzy!"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(221, 0, 0);">"Hello"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(221, 0, 0);">"#format"&nbsp;&nbsp;&nbsp;"{1:s}"&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"en"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Hello,&nbsp;{1}"&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ru"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Привет,&nbsp;{1}"&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 119, 0);">}&nbsp;<br>}</span></code></div></dt></dl>Формат строки состоит из разделов которые разделяются запятыми, а каждый раздел заключен в скобках. Каждый раздел имеет индекс и спецификатор формата, которые разделяются двоеточиями. Спецификаторы формата следуют общим правилам форматирования, однако в настоящее время, они поддерживаются только в следующих видах:<br><ul><li><span style="font-weight: bold;">d/i:</span>&nbsp;Отображение десятичных/целых значений</li><li><span style="font-weight: bold;">x:</span>&nbsp;Отображение шестнадцатеричных значений</li><li><span style="font-weight: bold;">f:</span>&nbsp;Отображение числа с плавающей точкой</li><li><span style="font-weight: bold;">s:&nbsp;</span>Отображение строки</li><li><span style="font-weight: bold;">c:&nbsp;</span>Отображение символов (поддерживается UTF-8)</li></ul>Заметим, что в настоящее время специальный формат типа "%T" не допускает внутри языка перевод строки.<br><br><br><span style="font-weight: bold;"><span style="font-size: 16px; line-height: 18px;">Использование в плагине</span></span><br><br>Плагины должны вызывать функцию&nbsp;<span style="font-style: italic;">LoadTranslations</span>&nbsp;на каждый файл с переводом, который они хотят использовать. Если это не будет сделано, то никакие переводы работать не будут, даже если другой плагин загрузил те же самые файлы. Это поможет предотвратить конфликты фраз между плагинами.<br><br><span style="font-weight: bold;">Примечание:</span>&nbsp;Языковые файлы загружаться после каждой смены карты (mapchange).&nbsp;<br>Даже если плагин будет перезагружен, кэшированный перевод файлов остается до следующей карты.<br>Встроенный перевод работает в любых формат-классовых функциях. Вводится новый спецификатор формата '%T', который указывает формат вставки определенного перевода фразы. В отличие от всех других спецификаторов формата, он требует как минимум двух параметров:<br><ul><li><span style="font-weight: bold;">1-ый параметр:</span>&nbsp;Строка, содержащая фразу для перевода.</li><li><span style="font-weight: bold;">2-ой параметр:</span>&nbsp;Одно из следующих:<br><ul><li>Постоянная&nbsp;<span style="font-style: italic;">LANG_SERVER</span>, которая определяет язык перевода по умолчанию.</li><li>Константа&nbsp;<span style="font-style: italic;">player ID</span>, которая определяет язык перевода установленный игроком.</li></ul></li><li><span style="font-weight: bold;">3-ий параметр и больше:</span>&nbsp;Вывод во фразе спецификаторов формата, если это необходимо.</li></ul><br><span style="font-weight: bold;">Пример:</span><br><dl class="codebox"><dt><div class="smallfont">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 2px; border: 1px inset; width: 430px; height: 82px; overflow: auto;"><code style="white-space: nowrap;"><span style="color: rgb(0, 0, 187);"></span><span style="color: rgb(0, 119, 0);">new&nbsp;</span><span style="color: rgb(0, 0, 187);">String</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">name</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">32</span><span style="color: rgb(0, 119, 0);">],&nbsp;</span><span style="color: rgb(0, 0, 187);">String</span><span style="color: rgb(0, 119, 0);">:</span><span style="color: rgb(0, 0, 187);">buffer</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">128</span><span style="color: rgb(0, 119, 0);">];&nbsp;<br></span><span style="color: rgb(0, 0, 187);">GetClientName</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">name</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">sizeof</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">name</span><span style="color: rgb(0, 119, 0);">));&nbsp;<br></span><span style="color: rgb(0, 0, 187);">PrintToChat</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"[SourceMod]&nbsp;%T"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"Hello"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">name</span><span style="color: rgb(0, 119, 0);">);</span></code></div></dt></dl><a href="http://cs416130.userapi.com/v416130361/1a2d/6K8OEjS2HoE.jpg" class="highslide" onclick="return hs.expand(this)">&nbsp;<img src="http://cs416130.userapi.com/v416130361/1a2d/6K8OEjS2HoE.jpg" style="max-width: 430px;border: 1px solid rgb(204, 204, 204);" title="Нажмите чтобы увеличить">&nbsp;</a><br><br><br><span style="font-weight: bold;">Формат параметров в отдельности:</span><br><ul><li><span style="font-weight: bold;">"Hello":&nbsp;</span>Фраза для перевода.</li><li><span style="font-weight: bold;">client/LANG_SERVER:</span>&nbsp;Кто получит перевод фразы.</li><li><span style="font-weight: bold;">name:</span>&nbsp;Имя игрока</li></ul>Наконец, существует вторая форма однострочного перевода, используя '%t'. Она допускается только в функциях, которые действуют непосредственно на одного или нескольких клиентов. Она исключает второй параметр, и использует указанного клиента.<br><br><span style="font-weight: bold;">Пример:</span><br><dl class="codebox"><dt><div class="smallfont">PHP код:</div><div class="alt2" dir="ltr" style="background-color: rgb(225, 228, 242); font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px; margin: 0px; padding: 2px; border: 1px inset; width: 430px; height: 34px; overflow: auto;"><code style="white-space: nowrap;"><code><span style="color: rgb(0, 0, 187);">PrintToChat</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">client</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"[SourceMod]&nbsp;%t"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(221, 0, 0);">"Hello"</span><span style="color: rgb(0, 119, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 187);">name</span><span style="color: rgb(0, 119, 0);">);</span></code></code></div></dt></dl>Как видно из этого примера, Мы не должны указывать индекс клиента больше, чем один раз. Таким образом, как правило, более удобны для использования ограниченные версии '%t' в функциях, таких как&nbsp;<span style="font-style: italic;">PrintToChat</span>. Однако, в функциях, которые не "управляют игроком", таких, как&nbsp;<span style="font-style: italic;">Format</span>&nbsp;или&nbsp;<span style="font-style: italic;">PrintToServer</span>, может быть использован только '%T'.<br><br><a href="http://wiki.alliedmods.net/Ru:Translations_(SourceMod_Scripting)" class="postlink"><span style="font-weight: bold; color: rgb(0, 0, 205);">Оригинал</span></a> Уроки SourceMod (SourcePawn) Скриптинга root /forum/6-80-1 Получение CommunityID (SteamID64) /forum/6-78-1 Sun, 03 Feb 2013 04:40:17 GMT Форум: <a href="/forum/6">Уроки SourceMod (SourcePawn) Скриптинга</a><br />Описание темы: Взято с world-source.ru<br />Автор темы: root<br />Автор последнего сообщения: Admin<br />Количество ответов: 0 <b>Получение CommunityID (SteamID64)</b> <br /><br /> <b>Описание:</b> <br /> Данное руководство покажет и поможет вам в получении CommunityID <br /><br /> <b>Использование:</b> <br /> Для получения ссылки клиента на профиль в STEAM нам нужен сам Steam ID. Для его получения можно воспользоваться <a class="link" href="http://docs.sourcemod.net/api/index.php?fastload=show&amp;id=401&amp;" rel="nofollow" target="_blank">GetClientAuthString</a>. <br /> Для получения ссылки нужно воспользоваться GetCommunityIDString <br /> <b>Пример:</b> <br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->new String:SteamID&#91;21] = "STEAM_0:0:6070829", String:CommunityID&#91;18]; <br /> GetCommunityIDString(SteamID, CommunityID, sizeof(CommunityID&#41;&#41;;<!--/uzc--></div></div><!--/uzcode-->Обратите внимание, что лучше всего установить размер CommunityIDs в значении 18 <br /> Ну и собственно сам stock <br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->stock bool:GetCommunityIDString(const String:SteamID&#91;], String:CommunityID&#91;], const CommunityIDSize&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Identifier&#91;17] = {7, 6, 5, 6, 1, 1, 9, 7, 9, 6, 0, 2, 6, 5, 7, 2, 8}; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decl String:SteamIDParts&#91;3]&#91;11]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ExplodeString(SteamID, ":", SteamIDParts, sizeof(SteamIDParts&#41;, sizeof(SteamIDParts&#91;]&#41;&#41; != 3&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcopy(CommunityID, CommunityIDSize, ""&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new SteamIDNumber&#91;CommunityIDSize - 1]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (new i = 0; i < strlen(SteamIDParts&#91;2]&#41;; i++&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SteamIDNumber&#91;CommunityIDSize - 2 - i] = SteamIDParts&#91;2]&#91;strlen(SteamIDParts&#91;2]&#41; - 1 - i] - 48; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Current, CarryOver; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (new i = (sizeof(Identifier&#41; - 1&#41;; i > -1 ; i--&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Current = Identifier &#91;i]+ (2 * SteamIDNumber&#91;i]&#41; + CarryOver; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i == sizeof(Identifier&#41; - 1 && strcmp(SteamIDParts&#91;1], "1"&#41; == 0&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Current++; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CarryOver = Current/10; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Current %= 10; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SteamIDNumber &#91;i]= Current; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommunityID &#91;i]= SteamIDNumber &#91;i]+ 48; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommunityID&#91;CommunityIDSize - 1] = '&#92;0'; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true; <br /> }<!--/uzc--></div></div><!--/uzcode--> <br /> <a class="link" href="https://forums.alliedmods.net/showthread.php?t=183443" rel="nofollow" target="_blank"><b><span style="color:#0000ff">Оригинал</span></b></a> Уроки SourceMod (SourcePawn) Скриптинга root /forum/6-78-1 Установка пользовательских ViewModels на оружие /forum/6-77-1 Sun, 03 Feb 2013 04:37:55 GMT Форум: <a href="/forum/6">Уроки SourceMod (SourcePawn) Скриптинга</a><br />Описание темы: http://forum.sn-project.ru/viewtopic.php?f=75&amp;t=1987<br />Автор темы: root<br />Автор последнего сообщения: Admin<br />Количество ответов: 0 Установка пользовательских ViewModels на оружие <br /><br /> Описание: <br /> Данное руководство покажет и поможет вам в установке пользовательских ViewModels на оружие <br /> <!--uzcode--><div class="bbCodeBlock"><div class="bbCodeName" style="padding-left:5px;font-weight:bold;font-size:7pt">Код</div><div class="codeMessage" style="border:1px inset;max-height:200px;overflow:auto;height:expression(this.scrollHeight<5?this.style.height:scrollHeight>200?'200px':''+(this.scrollHeight+5)+'px');"><!--uzc-->#include <sourcemod> <br /> #include <sdktools> <br /> #include <sdkhooks> <br /><br /> #pragma semicolon 1 <br /><br /> #define EF_NODRAW 32 <br /><br /> new CustomModel1; <br /> new CustomModel2; <br /><br /> new bool:SpawnCheck&#91;MAXPLAYERS+1]; <br /> new ClientVM&#91;MAXPLAYERS+1]&#91;2]; <br /> new bool:IsCustom&#91;MAXPLAYERS+1]; <br /><br /> public OnPluginStart(&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("player_death", Event_PlayerDeath&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HookEvent("player_spawn", Event_PlayerSpawn&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (new client = 1; client <= MaxClients; client++&#41;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (IsClientInGame(client&#41;&#41;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SDKHook(client, SDKHook_PostThinkPost, OnPostThinkPost&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientVM&#91;client]&#91;0] = GetEntPropEnt(client, Prop_Send, "m_hViewModel"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new PVM = -1; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ((PVM = FindEntityByClassname(PVM, "predicted_viewmodel"&#41;&#41; != -1&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (GetEntPropEnt(PVM, Prop_Send, "m_hOwner"&#41; == client&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (GetEntProp(PVM, Prop_Send, "m_nViewModelIndex"&#41; == 1&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientVM&#91;client]&#91;1] = PVM; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /> } <br /><br /> public OnMapStart(&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomModel1 = PrecacheModel("models/Weapons/v_smg_p90.mdl"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomModel2 = PrecacheModel("models/Weapons/v_smg_tmp.mdl"&#41;; <br /> } <br /><br /> public OnClientPutInServer(client&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SDKHook(client, SDKHook_PostThinkPost, OnPostThinkPost&#41;; <br /> } <br /><br /> public OnEntityCreated(entity, const String:classname&#91;]&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (StrEqual(classname, "predicted_viewmodel", false&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SDKHook(entity, SDKHook_Spawn, OnEntitySpawned&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /> } <br /><br /> public OnEntitySpawned(entity&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Owner = GetEntPropEnt(entity, Prop_Send, "m_hOwner"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((Owner > 0&#41; && (Owner <= MaxClients&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (GetEntProp(entity, Prop_Send, "m_nViewModelIndex"&#41; == 0&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientVM&#91;Owner]&#91;0] = entity; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (GetEntProp(entity, Prop_Send, "m_nViewModelIndex"&#41; == 1&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientVM&#91;Owner]&#91;1] = entity; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /> } <br /><br /> public OnPostThinkPost(client&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static OldWeapon&#91;MAXPLAYERS + 1]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static OldSequence&#91;MAXPLAYERS + 1]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static Float:OldCycle&#91;MAXPLAYERS + 1]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decl String:ClassName&#91;30]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new WeaponIndex; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!IsPlayerAlive(client&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new spec = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (spec != -1&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WeaponIndex = GetEntPropEnt(spec, Prop_Send, "m_hActiveWeapon"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetEdictClassname(WeaponIndex, ClassName, sizeof(ClassName&#41;&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (StrEqual("weapon_ump45", ClassName, false&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_nModelIndex", CustomModel1&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (StrEqual("weapon_mp5navy", ClassName, false&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_nModelIndex", CustomModel2&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WeaponIndex = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Sequence = GetEntProp(ClientVM&#91;client]&#91;0], Prop_Send, "m_nSequence"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Float:Cycle = GetEntPropFloat(ClientVM&#91;client]&#91;0], Prop_Data, "m_flCycle"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (WeaponIndex <= 0&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new EntEffects = GetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_fEffects"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntEffects |= EF_NODRAW; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_fEffects", EntEffects&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsCustom &#91;client]= false; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldWeapon &#91;client]= WeaponIndex; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldSequence &#91;client]= Sequence; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldCycle &#91;client]= Cycle; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (WeaponIndex != OldWeapon&#91;client]&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetEdictClassname(WeaponIndex, ClassName, sizeof(ClassName&#41;&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (StrEqual("weapon_ump45", ClassName, false&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new EntEffects = GetEntProp(ClientVM&#91;client]&#91;0], Prop_Send, "m_fEffects"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntEffects |= EF_NODRAW; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;0], Prop_Send, "m_fEffects", EntEffects&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntEffects = GetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_fEffects"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntEffects &= ~EF_NODRAW; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_fEffects", EntEffects&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_nModelIndex", CustomModel1&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntPropEnt(ClientVM&#91;client]&#91;1], Prop_Send, "m_hWeapon", GetEntPropEnt(ClientVM&#91;client]&#91;0], Prop_Send, "m_hWeapon"&#41;&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_nSequence", GetEntProp(ClientVM&#91;client]&#91;0], Prop_Send, "m_nSequence"&#41;&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntPropFloat(ClientVM&#91;client]&#91;1], Prop_Send, "m_flPlaybackRate", GetEntPropFloat(ClientVM&#91;client]&#91;0], Prop_Send, "m_flPlaybackRate"&#41;&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsCustom &#91;client]= true; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (StrEqual("weapon_mp5navy", ClassName, false&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new EntEffects = GetEntProp(ClientVM&#91;client]&#91;0], Prop_Send, "m_fEffects"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntEffects |= EF_NODRAW; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;0], Prop_Send, "m_fEffects", EntEffects&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntEffects = GetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_fEffects"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntEffects &= ~EF_NODRAW; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_fEffects", EntEffects&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_nModelIndex", CustomModel2&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntPropEnt(ClientVM&#91;client]&#91;1], Prop_Send, "m_hWeapon", GetEntPropEnt(ClientVM&#91;client]&#91;0], Prop_Send, "m_hWeapon"&#41;&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_nSequence", GetEntProp(ClientVM&#91;client]&#91;0], Prop_Send, "m_nSequence"&#41;&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntPropFloat(ClientVM&#91;client]&#91;1], Prop_Send, "m_flPlaybackRate", GetEntPropFloat(ClientVM&#91;client]&#91;0], Prop_Send, "m_flPlaybackRate"&#41;&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsCustom &#91;client]= true; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new EntEffects = GetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_fEffects"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntEffects |= EF_NODRAW; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_fEffects", EntEffects&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsCustom &#91;client]= false; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (IsCustom&#91;client]&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_nSequence", GetEntProp(ClientVM&#91;client]&#91;0], Prop_Send, "m_nSequence"&#41;&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntPropFloat(ClientVM&#91;client]&#91;1], Prop_Send, "m_flPlaybackRate", GetEntPropFloat(ClientVM&#91;client]&#91;0], Prop_Send, "m_flPlaybackRate"&#41;&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((Cycle < OldCycle&#91;client]&#41; && (Sequence == OldSequence&#91;client]&#41;&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_nSequence", 0&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (SpawnCheck&#91;client]&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpawnCheck &#91;client]= false; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (IsCustom&#91;client]&#41; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new EntEffects = GetEntProp(ClientVM&#91;client]&#91;0], Prop_Send, "m_fEffects"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntEffects |= EF_NODRAW; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;0], Prop_Send, "m_fEffects", EntEffects&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldWeapon &#91;client]= WeaponIndex; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldSequence &#91;client]= Sequence; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldCycle &#91;client]= Cycle; <br /> } <br /><br /> public Event_PlayerDeath(Handle:event, const String:name&#91;], bool:dontBroadcast&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new UserId = GetEventInt(event, "userid"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new client = GetClientOfUserId(UserId&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new EntEffects = GetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_fEffects"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntEffects |= EF_NODRAW; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetEntProp(ClientVM&#91;client]&#91;1], Prop_Send, "m_fEffects", EntEffects&#41;; <br /> } <br /><br /> public Event_PlayerSpawn(Handle:event, const String:name&#91;], bool:dontBroadcast&#41; <br /> { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new UserId = GetEventInt(event, "userid"&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new client = GetClientOfUserId(UserId&#41;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpawnCheck &#91;client]= true; <br /> }<!--/uzc--></div></div><!--/uzcode--> <a class="link" href="https://forums.alliedmods.net/showthread.php?t=181558" rel="nofollow" target="_blank"><span style="color:#0000ff"><b>Оригинал</b></span></a> Уроки SourceMod (SourcePawn) Скриптинга root /forum/6-77-1