ЗАКРЫТЬ
Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Новости

30-дек
29-дек
26-дек
15-дек

5 страниц V   1 2 3 4 »

Склад маленького кода

, мелочь пузатая
Safety1st
сообщение 21.5.2014, 10:39
Сообщение #21
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Чуток улучшен код HS Stats, v 0.3 -> 0.4, 'плагин' тут.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 30.5.2014, 18:31
Сообщение #22
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Simple Daynight Code

Универсальная готовая платформа для переключения между 2-мя режимами в зависимости от времени суток. Может использоваться как основа для плагинов 'Ночной режим', 'Map On Time' и т.п., а также любых плагинов, которые должны 'работать' строго 'от' и 'до', например, плагины розыгрышей, 'запуск / отключение плагина в определенное время'.

Ключевые особенности:
• произвольные границы режима;
• смену режима можно задать с точностью до минуты;
• привязка к локальному времени выполняется однократно, нет повторяющейся функции для проверки на время.

Старт и конец 'ночного' режима задаются в #define NIGHT_MODE_START и #define NIGHT_MODE_END. Раскомментировав опцию #define DEBUG можно посмотреть вживую за сменами режимов:
Скрытый текст
Код
[AMXX] Loaded 3 admins from file

Night mode interval: start - 16:39, end - 16:44.
Current time - 16:37, current mode - 'day', 00:02 before mode change.

Executing day mode cmds...


Fuck yeah! Server has changed mode to night one.

Night mode interval: start - 16:39, end - 16:44.
Current time - 16:39, current mode - 'night', 00:05 before mode change.

Executing night mode cmds...


Fuck yeah! Server has changed mode to day one.

Night mode interval: start - 16:39, end - 16:44.
Current time - 16:44, current mode - 'day', 23:55 before mode change.

Executing day mode cmds...

Код
[AMXX] Loaded 3 admins from file

Night mode interval: start - 16:00, end - 16:51.
Current time - 16:47, current mode - 'night', 00:04 before mode change.

Executing night mode cmds...


Fuck yeah! Server has changed mode to day one.

Night mode interval: start - 16:00, end - 16:51.
Current time - 16:51, current mode - 'day', 23:09 before mode change.

Executing day mode cmds...

Команды, которые должны выполняться при инициализации режима, добавляются в блок ProcessCurrentMode(). Если нужен информер незадолго до изменения режима - задачу на него поставить там же, а задержку ей назначить как разницу между giNextChangeDelay и временем, насколько заранее перед сменой режима начать показывать информер, не забыв перевести итог из минут в секунды.

Функция GetNextModeChangeDelay( currenttime = -1 ) возвращает, сколько времени в минутах осталось до очередной смены режима. Текущее локальное время (сколько минут прошло с начала суток) можно не указывать: она определит сама. Легко добавить API (нативу для использования в других плагинах). Функция GetNextModeChangeDelayWord() только 'намечена' (не реализована), предполагается её использование для информирования игроков в 'человеческом формате' (5 ч. 2 мин или 3 ч. вместо 05:02:39 и 03:00:21 соответственно).

v0.2b 19.05.2014 Прикрепленный файл  simple_daynight_code.sma ( 5.5 килобайт ) Кол-во скачиваний: 127


Если будут вопросы по алгоритму, я подскажу.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 7 раз
   + Цитировать сообщение
Safety1st
сообщение 1.6.2014, 19:05
Сообщение #23
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Добавляем поддержку цветного чата для AMXX 1.8.1/1.8.2-dev/1.8.2

Собственная поддержка colorchat'а появилась только в AMXX 1.8.3-dev с билда hg185 (с 23.08.2013 г.) И тут возникли некоторые неудобства с совместимостью плагинов, сделанных для AMXX 1.8.3-dev, с предыдущими версиями AMXX и наоборот. Есть несколько вариантов решения 'проблемы'. Поскольку я занимаюсь разработкой плагинов в первую очередь под последние dev-версии AMXX, мне удобнее добавлять поддержку цветного чата для старых билдов дополнительно.

Пример:
Код
#include <amxmodx>

#if AMXX_VERSION_NUM < 183
    // AMXX 1.8.3-dev since hg185 has its own colorchat support
    #include <colorchat>
    #define print_team_default  DontChange
    #define print_team_grey     Grey
    #define print_team_red      Red
    #define print_team_blue     Blue
#endif

public plugin_init() {
    // ...

    register_dictionary( "dictionary.txt" )
}

SomeFunction() {
    client_print_color( id, print_team_red, "%L", id, "TEST_MSG" )
    client_print_color( 0, print_team_default, "%L", LANG_PLAYER, "TEST_MSG2" )
}

Для совместимости добавляется только блок #if AMXX_VERSION_NUM < 183 ... #endif. Всё! good.gif

Преимущества описанного способа:
• сервера с последними dev-версиями AMXX используют встроенные возможности AMXX;
• не требуются различные словари (lang-файлы) для разных версий AMXX.

Нюансы:
• словарь составляется для AMXX 1.8.3! Т.е. только ^1 ... ^4, никаких !n, !t, !g и прочего;
• stock-версия (инклуд) для старых билдов не умеет корректно обрезать текст в кодировке UTF-8. Если тот не влезет в 190 символов (максимальный разрешённый размер строки в чате) - последний символ может 'пострадать'. В AMXX 1.8.3-dev такого 'бага' нет.

Внимание! Чтобы всё было вот так вот просто и легко, требуется использовать инклуд stock'ового colorchat'а от ConnorMcLeod'а, улучшенный Lev'ом. Загрузка тут, эта же ссылка указана в шапке топика. Инклуд полностью совместим со всеми предыдущими версиями, поэтому для компиляции плагинов на AMXX 1.8.1/1.8.2-dev/1.8.2 рекомендуется использовать только его. Так и для потребителей будет удобно, когда со всеми плагинами в комплекте идёт один и тот же инклуд, а не свой у каждого скриптера) Или, на крайний случай, - взаимозаменяемые. Например, такой инклуд: Прикрепленный файл  colorchat.inc.zip ( 6.56 килобайт ) Кол-во скачиваний: 12
Ничем по сути не отличается и полностью совместим с версией от ConnorMcLeod & Lev. Здесь только добавлена пара комментариев и совместимость с плагинами, использующими инклуд от Numb.
--

Если в существующий плагин требуется добавить поддержку возможностей AMXX 1.8.3-dev в плане цветного чата, но переделывать его не хочется, можно пойти аналогичным - добавка в шапку, но другим путём. Мб опишу его и как 'работать' с нативой client_print_color() и, особенно, с её параметром sender (куда можно подставлять print_team_*), в другой раз.
--

И на всякий случай
Цитата(Safety1st @ 15.12.2013, 4:01) *
Это склад, а не топик по обучению или поддержке. Просьба отнестись с пониманием, что ваши посты могут быть проигнорированы. Новички в скриптинге могут создать свою собственную тему в этом разделе, задать вопросы и кинуть ссылку на нужный пост в моей.


Отредактировал: Safety1st, - 15.5.2015, 12:19
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Safety1st
сообщение 14.6.2014, 2:40
Сообщение #24
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Цитата(Safety1st @ 15.12.2013, 4:01) *
Приобщаемся к AMXX 1.8.3:
• ...
фикс бан-системы AMXX

На серверах со сторонней бан-системой вряд ли пригодится, ну если только админы используют команду amx_addban... И ещё: из-за нововведения 'временные баны' (отдельный флаг 'v' и квар amx_tempban_maxtime) в плагине захардкожен не только флаг L (ADMIN_RCON), но и D (ADMIN_BAN). Потому не всегда стоит отступать о дефолтного распределения флагов через cmdaccess.ini или хотя бы не забывать проверять работу с правами стандартного админа.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 17.6.2014, 10:45
Сообщение #25
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Смена слота для оружия
Простейший плагин-пример на смену слота для glock'а. Без понятия, где это может пригодиться.


Все необходимые комментарии присутствуют в sma.
v0.1 17.06.2014 г. Прикрепленный файл  change_glock_slot.sma ( 1.45 килобайт ) Кол-во скачиваний: 66
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 5 раз
   + Цитировать сообщение
Safety1st
сообщение 15.7.2014, 6:58
Сообщение #26
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Автозакрытие меню плагина при выходе из зоны покупки

Видимо, может применяться в shop'ах, работающих аналогично стандартному меню покупки: в пределах байзоны.

Алгоритм: ловить скрытие значка buymenu, проверять, открыто ли меню, и если да, то убирать его. Над проверкой пришлось попотеть. В коде присутствуют все необходимые комментарии.

Код
Код:
/**
* Last update:
* 7/15/2014
*
* Credits:
* - to Exolent[jNr] for menu overlapping fix
* - to ConnorMcLeod for 'Menu Close Fix' plugin
*/

#include <amxmodx>
#include <cstrike>
#include <fakemeta>

#define PLUGIN "Menu Obeying BuyZone sample"
#define VERSION "0.3"
#define AUTHOR "Safety1st"

const m_iMenu = 205

#define cs_get_user_menu(%0) get_pdata_int( %0, m_iMenu )

#define MAX_PLAYERS 32
new giMenu[MAX_PLAYERS + 1]

public plugin_init() {
register_plugin( PLUGIN, VERSION, AUTHOR )

register_clcmd( "shopmenu", "ShowMenuCmd" )
// ...
register_event( "StatusIcon", "CloseOpenedMenu", "b", "1=0", "2=buyzone" )
}

public ShowMenuCmd(id) {
// check access
// ...

if( cs_get_user_buyzone(id) )
ShowMenu(id)
else
client_print( id, print_chat, "Sorry, you are not in buyzone." )

return PLUGIN_HANDLED
}

ShowMenu(id) {
new iMenu = menu_create( "Shop Menu Title", "MenuHandler" )
// ...

#if AMXX_VERSION_NUM < 183
set_pdata_int( id, m_iMenu, 0 )
#endif
menu_display( id, iMenu )
giMenu[id] = iMenu
}

public client_putinserver(id) {
giMenu[id] = -1 // no menu
}

public MenuHandler( id, menu, item ) {
giMenu[id] = -1

if( item == MENU_EXIT ) {
menu_destroy(menu)
return PLUGIN_HANDLED
}

// ...

return PLUGIN_HANDLED
}

public CloseOpenedMenu(id) {
const Menu_Buy = 4
const Menu_BuyItem = 10
if( Menu_Buy <= cs_get_user_menu(id) <= Menu_BuyItem ) {
/* Player is viewing old-style buy menu. Client forces menu to close automatically
by sending 'menuselect 10' command. Our menu if exist would be closed too.
VGUI buy menu has id = 14 and could not overlap old-style menu.
There is nothing to worry about. More info about menu ids is here:
forums.alliedmods.net/showthread.php?t=130708 */
return
}

new iOldMenu, iNewMenu
player_menu_info( id, iOldMenu, iNewMenu )
if( iNewMenu != -1 && iNewMenu == giMenu[id] ) {
/* don't take into account active 'old-style' AMXX menu for safety
because we don't know for sure whether that menu has overlapped our menu and vice versa */
menu_cancel(id) // force client to choose MENU_EXIT to destroy our menu
show_menu( id, 0, "^n", 1 ) // show empty menu to hide our menu on player's screen
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 7 раз
   + Цитировать сообщение
Safety1st
сообщение 24.7.2014, 2:17
Сообщение #27
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Выставление тэга 'VIP' в таблице счета

Распространённый вариант в паблике - быдлокод: после спавна с небольшой задержкой отправляется месседж, стирающий имеющиеся тэги и устанавливающий тэг 'VIP. Последний сбрасывается при подбирании бомбы.

Вот самый оптимальный вариант выставления тэга 'VIP' в таблице счета. Дополнительных месседжей нет: правятся отправляемые игрой. Не конфликтует с тэгами 'DEAD' и 'BOMB': у живого TT с бомбой его тиммейты видят тэг 'BOMB', оппоненты - тэг 'VIP'. Главный функционал сделал xpaw и доработали Radius и я.

Код
Код
#include <amxmodx>

const VIP_FLAG = ADMIN_IMMUNITY     // flag 'a' by default

public plugin_init() {
    register_message( get_user_msgid ("ScoreAttrib"), "msg_ScoreAttrib" )
}

public msg_ScoreAttrib( msg_id, msg_dest, receiver ) {
    /* original code by xpaw & Radius */
    #define ARG_PlayerID    1
    #define ARG_Flags       2
    #define SCOREBOARD_VIP  (1 << 2)

    if( get_user_flags( get_msg_arg_int(ARG_PlayerID) ) & VIP_FLAG )
        set_msg_arg_int( ARG_Flags, ARG_BYTE, get_msg_arg_int(ARG_Flags) | SCOREBOARD_VIP )
}

Цитата(Radius)
Важно! VIP статус не отображается у живых Террористов в таблице счета. Это ограничения самой игры, потому что VIP статус взят из режима игры VIP Assassination. По правилам этого режима живые террористы никак не могут знать кто играет за VIP, также как и Контр-Террористы не могут знать кто несет бомбу в режиме Bomb / Defuse.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 11 раз
   + Цитировать сообщение
Safety1st
сообщение 25.7.2014, 5:20
Сообщение #28
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Глобальная установка скорости игрока

Мало однократно установить скорость с помощью set_pev( id, pev_maxspeed, <> ) / entity_set_float( id, EV_FL_maxspeed, <> ) / set_user_maxspeed( id, <> ). CS возвращает своё значение при каждой смене оружия или вторичной атаке, во время freezetime, смерти игрока, установки и разминировании бомбы. Значит, все изменения надо ловить и принимать меры.

В обоих примерах дополнительно показаны правильная установка скорости, чтобы она не назначалась во время freezetime, и возврат к 'нормальной' (соответствующей текущему оружию).


1-й способ подойдёт в случае, когда скорость должна меняться только в случае определённого оружия (не глобально для всего).
Способ 1
Код:
/**
* Method to change player speed for certain weapons
*
* Credits:
* - to Leonidddd for helping with forwards relative to setting speed
* - to Asmodai for the idea how setting speed during freezetime and after death could be easily detected
*/

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

/*---------------EDIT ME------------------*/
#define MAX_CLIENTS 32
#define CUSTOM_SPEED 400.0 // 400.0 is the max possible value without changing cl_<>speed client cvars
/*----------------------------------------*/

#define PLUGIN "Set Custom Speed per Weapon (sample)"
#define VERSION "0.1b"
#define AUTHOR "Safety1st"

new giSpeed[MAX_CLIENTS + 1]

const SPEED_OFF = 0
const SPEED_ON = 1

public plugin_init() {
register_plugin( PLUGIN, VERSION, AUTHOR )

RegisterForwards4SettingSpeed()

register_clcmd( "say /speed", "ToggleSpeedCmd" )
}

RegisterForwards4SettingSpeed() {
// just for convenience (function could be easily collapsed)

new szItemName[][] = {
"weapon_p228",
//"weapon_shield", // it is not a weapon in common sense
"weapon_scout",
"weapon_hegrenade",
"weapon_xm1014",
"weapon_c4",
"weapon_mac10",
"weapon_aug",
"weapon_smokegrenade",
"weapon_elite",
"weapon_fiveseven",
"weapon_ump45",
"weapon_sg550",
"weapon_galil",
"weapon_famas",
"weapon_usp",
"weapon_glock18",
"weapon_awp",
"weapon_mp5navy",
"weapon_m249",
"weapon_m3",
"weapon_m4a1",
"weapon_tmp",
"weapon_g3sg1",
"weapon_flashbang",
"weapon_deagle",
"weapon_sg552",
"weapon_ak47",
"weapon_knife",
"weapon_p90"
}

for( new j; j < sizeof szItemName; j++ )
RegisterHam( Ham_CS_Item_GetMaxSpeed, szItemName[j] , "CS_Item_GetMaxSpeed_Pre", .Post = 0 )
}

public client_putinserver(id) {
giSpeed[id] = SPEED_OFF
}

public ToggleSpeedCmd(id) {
giSpeed[id] ^= 1 // just 'toggle' another mode: 1 to 0 or 0 to 1

switch( giSpeed[id] ) {
case SPEED_ON : SetSpeed( id, CUSTOM_SPEED )
default : {
// reset speed back to normal (specific for current active weapon)
const m_pActiveItem = 373
new Float:flSpeed = 240.0 // just used the default value that CS does itself
new iActiveItem = get_pdata_cbase( id, m_pActiveItem )
if( iActiveItem != FM_NULLENT )
ExecuteHamB( Ham_CS_Item_GetMaxSpeed, iActiveItem, flSpeed )
SetSpeed( id, flSpeed )
}
}
}

SetSpeed( id, Float:speed ) {
/* to prevent setting custom speed during freezetime and for observers.
there is no need to check for observers if custom speed could be activated by alive players only */
#define SPEED_FREEZETIME 1.0
#define SPEED_OBSERVER 900.0

static Float:flSpeed
pev( id, pev_maxspeed, flSpeed )
switch( flSpeed ) {
case SPEED_FREEZETIME, SPEED_OBSERVER : return
}

set_pev( id, pev_maxspeed, speed )
}

public CS_Item_GetMaxSpeed_Pre( weapon ) {
const m_pPlayer = 41
const XO_WEAPON = 4

static iPlayer
iPlayer = get_pdata_cbase( weapon, m_pPlayer, XO_WEAPON )

if( giSpeed[iPlayer] ) {
SetHamReturnFloat( CUSTOM_SPEED )
return HAM_SUPERCEDE
}

return HAM_IGNORED
}
Был вопрос, поясню алгоритм функции на форвард:
Код
SetHamReturnFloat( CUSTOM_SPEED )
return HAM_SUPERCEDE
Форвард зарегистрирован в Pre, он вызовется перед вызовом самой функции (не нашей, которая в плагине, а той, которую захотела выполнить игра). Мы выполнение функции блокируем с помощью return HAM_SUPERCEDE. Игра ожидает результата работы функции - числа, которое та должна вернуть. Нужное нам число мы как раз и подставляем с помощью SetHamReturnFloat, и модуль Ham Sandwitch возвращает его игре. Та знать не знает, что на самом деле функция не была выполнена, а ей подсунули левое число.


Для глобальной смены скорости лучше использовать Ham-форвард Ham_CS_Player_ResetMaxSpeed. Кстати, форвард однократно вызывается и после смерти игрока при переходе его в наблюдатели.
Способ 2
Код:
/**
* Credits:
* - to Leonidddd for helping with forwards relative to setting speed
* - to Asmodai for the idea how setting speed during freezetime and after death could be easily detected
* - to PRoSToTeM@ for method to hook Ham_CS_Player_ResetMaxSpeed on AMXX below 1.8.3-dev
*/

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

/*---------------EDIT ME------------------*/
#define MAX_CLIENTS 32
#define CUSTOM_SPEED 400.0 // 400.0 is the max possible value without changing cl_<>speed client cvars
/*----------------------------------------*/

#define PLUGIN "Set Custom Speed Global (sample)"
#define VERSION "0.1b"
#define AUTHOR "Leonidddd / Safety1st"

new giSpeed[MAX_CLIENTS + 1]

const SPEED_OFF = 0
const SPEED_ON = 1

#if !defined Ham_CS_Player_ResetMaxSpeed
#define Ham_CS_Player_ResetMaxSpeed Ham_Item_PreFrame
#endif

public plugin_init() {
register_plugin( PLUGIN, VERSION, AUTHOR )

RegisterHam( Ham_CS_Player_ResetMaxSpeed, "player", "Fwd_Ham_ResetMaxSpeed_Post", .Post = 1 )

register_clcmd( "say /speed", "ToggleSpeedCmd" )
}

public client_putinserver(id) {
giSpeed[id] = SPEED_OFF
}

public ToggleSpeedCmd(id) {
giSpeed[id] ^= 1 // just 'toggle' another mode: 1 to 0 or 0 to 1

switch( giSpeed[id] ) {
case SPEED_ON : SetCustomSpeed(id)
default : {
// reset speed back to normal (specific for current active weapon)
ExecuteHamB( Ham_CS_Player_ResetMaxSpeed, id )
}
}
}

SetCustomSpeed(id) {
// to prevent setting custom speed during freezetime and for observers
#define SPEED_FREEZETIME 1.0
#define SPEED_OBSERVER 900.0

static Float:flSpeed
pev( id, pev_maxspeed, flSpeed )
switch( flSpeed ) {
case SPEED_FREEZETIME, SPEED_OBSERVER : return
}

set_pev( id, pev_maxspeed, CUSTOM_SPEED )
}

public Fwd_Ham_ResetMaxSpeed_Post(id) {
if( giSpeed[id] )
SetCustomSpeed(id)

return HAM_IGNORED
}


Отредактировал: Safety1st, - 3.1.2016, 23:41
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 5 раз
   + Цитировать сообщение
Safety1st
сообщение 3.8.2014, 7:12
Сообщение #29
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Как различить AMXX 1.8.2 и 1.8.2-dev?

'Отличить' релизную AMXX 1.8.2 от более ранних dev-билдов на этапе компиляции нельзя. Но можно во время выполнения плагина. Например, так:
Код
#if AMXX_VERSION_NUM == 182
    // it seems to be the only way to distinguish between 1.8.2-dev from 1.8.2
    new giDev182
#endif

public plugin_init() {
    // ...

#if AMXX_VERSION_NUM == 182
    new szAmxxVer[10]
    get_amxx_verstring( szAmxxVer, charsmax(szAmxxVer) )
    if( !strcmp( szAmxxVer, "1.8.2-dev" ) )
        giDev182 = 1
#endif
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 3.8.2014, 7:32
Сообщение #30
Стаж: 4 года 7 месяцев

Сообщений: 1502
Благодарностей: 978
Полезность: 708

Цитата(Safety1st @ 25.7.2014, 7:20) *
В AMXX 1.8.3-dev появился Ham-форвард Ham_CS_Player_ResetMaxSpeed
Его и в более ранних версиях можно юзать:
Код:
#if !defined Ham_CS_Player_ResetMaxSpeed
#define Ham_CS_Player_ResetMaxSpeed Ham_Item_PreFrame
#endif


Отредактировал: [WPMG]PRoSToTeM@, - 3.8.2014, 7:32
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 4 раз
   + Цитировать сообщение
Статус пользователя csnet
сообщение 3.8.2014, 8:06
Сообщение #31
Стаж: 3 года 2 месяца

Сообщений: 4010
Благодарностей: 3494
Полезность: 715

хоть так, чтобы не быдлокодили скорость в curweapon


СВЕРШИЛОСЬ !!! > https://youtu.be/iGy4Tai7JtA
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 3.8.2014, 16:34
Сообщение #32
Стаж: 4 года 7 месяцев

Сообщений: 1502
Благодарностей: 978
Полезность: 708

Цитата(Safety1st @ 15.12.2013, 4:01) *
Простенький способ с помощью get_user_weapon() не работает корректно для HE/C4 и вызывает нарекания у многих 'скриптеров' с точки зрения точности.

Поясню насчёт точности: get_user_weapon определяет оружие в руках в хуке CurWeapon, который в свою очередь может посыслаться на следующем PlayerThink после Deploy (в некоторых ситуациях может и не критично, но всё же).
Однако можно вручную установить пушку для get_user_weapon через нативу amxx_setpl_curweap, т.е. вызывать её в Deploy оружия (возможно ещё Holster пригодится в некоторых случаях, возможно надо ещё что-то хукать для правильных результатов).
Однако лучше использовать метод через pdata как у Safety1st и сделано (можно функцию или макрос запилить, типа cs_get_user_weapon).

Насчёт установки v_ и p_ моделей в CurWeapon: клиент с большим пингом может заметить, что модель не сразу меняется (выше писал когда CurWeapon посылается) (что-то сейчас воспроизвести не удаётся, однако видел при большом пинге на одном зм сервере, для этого по идее команда в пакете, должна прийти позже clc_move (либо в clc_move не должны содержаться usercmd...)).

Отредактировал: [WPMG]PRoSToTeM@, - 3.8.2014, 17:28
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 3 раз
   + Цитировать сообщение
Safety1st
сообщение 3.8.2014, 16:43
Сообщение #33
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Цитата([WPMG]PRoSToTeM@ @ 3.8.2014, 9:32) *
Его и в более ранних версиях можно юзать

Ну спасибо, придётся весь минигайд теперь переделывать

Цитата([WPMG]PRoSToTeM@ @ 3.8.2014, 18:34) *
Поясню насчёт точности

Спасибо, добавил к описанию good.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 3.8.2014, 18:28
Сообщение #34
Стаж: 4 года 7 месяцев

Сообщений: 1502
Благодарностей: 978
Полезность: 708

Цитата(Safety1st @ 3.8.2014, 18:43) *
Ну спасибо, придётся весь минигайд теперь переделывать

Я хотел тебе ещё в той теме на amx-x сказать про это, только не сразу врубился, про что ты именно говорил (я вообще подумал что в 1.8.3 его "убрали" crazy.gif или что в 1.8.3 GetMaxSpeed добавили)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 5.8.2014, 11:55
Сообщение #35
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Разбиение строки из чата на 2 части

Пусть формат интересующих плагин сообщений такой:
Код
#color message
где:
# - указатель, что сообщение должно быть преобразовано;
color - служебный параметр, указывает цвет сообщения (red/blue/green);
• message - само сообщение, тут могут быть несколько слов с пробелами.

Даны 2 способа, 2-й в принципе лучше - он проще. Учтены лишние пробелы. И дополнительно показан пример обработки в зависимости от значения первого параметра.

Подробнее здесь.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 6.8.2014, 17:05
Сообщение #36
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Фишки меню
источник: AMXXModX.ru

скрытие меню у игроков
Чтобы убрать меню с экрана игрока, ему нужно отправить новое меню, но без клавиш для выбора. Какой текст - не важно, разумнее использовать пустышку. Ну и минимальное время показа - 1 секунда.

Скрыть меню у определённого игрока:
Код
show_menu( id, 0, "^n", 1 )
Скрыть меню у всех игроков:
Код
show_menu( 0, 0, "^n", 1 )

Таким же способом скрываются и 'новые' меню (см. newmenus.inc ): они всего лишь обёртка на т.н. 'старыми': на самом деле в игре меню одно и то же. Важно не забыть предварительно 'нажать' кнопку Выход за игрока с помощью:
Код
menu_cancel(id)


длинные строки в меню
Максимальный размер текста меню - 512 символов. Но размер пунктов меню не лимитируется: они могут быть произвольного размера. Ограничивается только длина текста, не содержащего служебные тэги \d, \r, \w, \y и \R - 80 символов. Поэтому если нужен длинный пункт - просто дополните текст тэгами в нужных местах. На экране помещаются 90 символов при разрешении 800x600 и 115 - при 1024x768. Пример ниже.


трансляция команд в клавиши
Это встроенная возможность игры. В тексте меню указывается команда, а при показе меню она автоматически заменяется на кнопку, на которую назначена у игрока. Работает такая возможность только для 'плюсовых' команд: +attack, +use, +hook и т.д., но для любых из них.

Пример на последние 2 случая:
Код
Код:
/**
* Demonstration of 2 menu features: 'translation' and long items.
*/

#include <amxmodx />

#define PLUGIN "Menu Features Test"
#define VERSION "0.1"
#define AUTHOR "Safety1st"

public plugin_init() {
register_plugin( PLUGIN, VERSION, AUTHOR )

register_clcmd( "menu_test", "MenuCommand" )
}

public MenuCommand(id) {
new szMenu[512] // it is maximum allowed menu size
new iLen = formatex( szMenu, charsmax(szMenu), "\yMenu Test:^n^n" )

#define ITEMS 3
static const szMenuItem[ITEMS][] = {
"Sample bind USE key: \y+use",
"Sample bind TEST key: \y+test",
"Собака серая Собака белая | \wСобака серая Собака белая2 | \wСобака серая Собака белая3 | \yСобака жёлтая"
}

for( new i; i < sizeof szMenuItem; i++ )
iLen += formatex( szMenu[iLen], charsmax(szMenu) - iLen, "\y%d. \w%s^n", i + 1, szMenuItem[i] )

const MENU_KEYS = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MEN
U_KEY_8|MENU_KEY_9|MENU_KEY_0
show_menu( id, MENU_KEYS, szMenu )

return PLUGIN_HANDLED
}


Чтобы меню выглядело как на скриншоте, необходимо предварительно забиндить клавишу:
Код
bind "?" "+test"
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 3 раз
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 11.8.2014, 0:43
Сообщение #37
Стаж: 4 года 7 месяцев

Сообщений: 1502
Благодарностей: 978
Полезность: 708

Safety1st, так и не дописал про использование Ham_CS_Player_ResetMaxSpeed на более ранних версиях amxmodx
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 11.8.2014, 1:34
Сообщение #38
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

[WPMG]PRoSToTeM@, просто руки не дошли пока. Напишу обязательно.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя csnet
сообщение 11.8.2014, 7:41
Сообщение #39
Стаж: 3 года 2 месяца

Сообщений: 4010
Благодарностей: 3494
Полезность: 715

насколько я помню раньше был просто Preframe который клонировали с новым названием под resetmaxspeed, где то на оленях была история написана


СВЕРШИЛОСЬ !!! > https://youtu.be/iGy4Tai7JtA
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 26.8.2014, 7:06
Сообщение #40
Стаж: 5 лет 4 месяца

Сообщений: 6823
Благодарностей: 7774
Полезность: 718

Дропнуть пистолет без дропа щита

Как известно, первым всегда дропается щит, кроме случая, когда игрок держит в руках бомбу. При выполнении команды есть проверка на его наличие.

Решение - на время установить нужный оффсет, чтобы игра посчитала, что щита у игрока нет, затем дропнуть оружие, затем 'вернуть' щит. Одна проблема: при дропе оружия вызывается функция поиска лучшего из оставшихся у игрока и оно деплоится (достаётся). На тот момент щит ещё 'не возвращён' и игрок его не увидит. Просто деплоим оружие повторно после 'возврата' щита.

Код только для AMXX 1.8.3-dev
Код
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>

DropWithoutShield(id) {
    const m_bHasShield = 2043

    new iRestore

    if( cs_get_user_shield(id) )
        // temporary set new info to be able to drop weapon
        iRestore = set_pdata_bool( id, m_bHasShield, false )

    /* тут должен быть собственно дроп оружия; пример можно посмотреть в плагине 'Weapon Menu Hardcoded'
        http://c-s.net.ua/forum/index.php?act=findpost&pid=638283 */

    if( iRestore ) {
        set_pdata_bool( id, m_bHasShield, true )

        // due to weapon dropping we have deployed another weapon without a shield drawn;) so redeploy it
        const m_pActiveItem = 373
        new iActiveItem = get_pdata_cbase( id, m_pActiveItem )
        if( iActiveItem )
            ExecuteHamB( Ham_Item_Deploy, iActiveItem )
    }
}

Код с поддержкой и предыдущих версий AMXX куда более громозкий:
Код
Код
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>

DropWithoutShield(id) {
#if AMXX_VERSION_NUM < 183
    const m_boolsUserPrefsAndShield = 510
    const m_bHasShield = (1<<24)
#else
    const m_bHasShield = 2043
#endif

    new iRestoreData

    if( cs_get_user_shield(id) ) {
        // temporary set new info to be able to drop weapon
    #if AMXX_VERSION_NUM < 183
        iRestoreData = get_pdata_int( id, m_boolsUserPrefsAndShield )
        set_pdata_int( id, m_boolsUserPrefsAndShield, iRestoreData & ~m_bHasShield )
    #else
        iRestoreData = set_pdata_bool( id, m_bHasShield, false )
    #endif
    }

    /* тут должен быть собственно дроп оружия; пример можно посмотреть в плагине 'Weapon Menu Hardcoded'
        http://c-s.net.ua/forum/index.php?act=findpost&pid=638283 */

    if( iRestoreData ) {
    #if AMXX_VERSION_NUM < 183
        set_pdata_int( id, m_boolsUserPrefsAndShield, iRestoreData | m_bHasShield )
    #else
        set_pdata_bool( id, m_bHasShield, true )
    #endif

        // due to weapon dropping we have deployed another weapon without a shield drawn;) so redeploy it
        const m_pActiveItem = 373
        new iActiveItem = get_pdata_cbase( id, m_pActiveItem )
        if( iActiveItem )
            ExecuteHamB( Ham_Item_Deploy, iActiveItem )
    }
}

Пример применения функционала - в плагине 'Weapon Menu Hardcoded'.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 3 раз
   + Цитировать сообщение
5 страниц V   1 2 3 4 »
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: