AMX MOD X
Среда, 11.12.2024, 22:17:34



Приветствую Вас Гость | RSS
[ Главная ] [ Подскажите правельную функцию в hamsandwich ! - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
Модератор форума: slogic, AlMod  
Подскажите правельную функцию в hamsandwich !
KokaДата: Среда, 01.07.2009, 19:57:33 | Сообщение # 1
Полковник
Группа: Пользователи
Сообщений: 169
Репутация: 1
Статус: Не в сети
Нужно перехватить момент, когда клиент получает броню (любую) разным способом (покупает, поднимает и т.д.), а затем установить значение этой брони, чтобы до клиента дошло это без блокирования дополнительных функций (звук при покупке/поднятии, снимание денег и т.д.)

примеры:
1)у игрока 0 AP и он купил броню (любую, например b-8-2) - у игрока появилось 200 AP.
2)у игрока 20 AP и он поднял с земли броню, - у игрока появилось 200 AP.

help plz ! :'(


стал ощущать рефлексы тоньше, оставаясь как всегда с идеей той же...
 
PAHANCSДата: Среда, 01.07.2009, 20:54:57 | Сообщение # 2
Полковник
Группа: Пользователи
Сообщений: 183
Репутация: 4
Статус: Не в сети
Не пробывал но может вот это, регистрировать по имени класса брони "item_kevlar", "item_assaultsuit":

Code

  /**
   * Description:  Adds the item to the player.
   * Forward params:    function(this, idPlayer);
   * Return type:  Integer (boolean).
   * Execute params:    ExecuteHam(Ham_Item_AddToPlayer, this, idPlayer);
   */
  Ham_Item_AddToPlayer

Ток проблема в том что нет данных о значение этой брони, но можно самому
всё это устроить и ставить ретурн на HAM_SUPERCEDE.


PAHANCS
 
se7hДата: Среда, 01.07.2009, 23:39:18 | Сообщение # 3
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
можно запросто обойтись без hamsandwich

используй эвент Battery, вызывается каждый раз когда изменяется количество брони

Code
#include <amxmodx>
#include <fakemeta>

#define OFFSET_ARMORTYPE    112

public plugin_init()
{
          register_event("Battery", "event_set_armor", "be")    //если дело касается только покупки или поднятия броника когда тебе нужен лишь момент установки AP в 100 то можно добавить дополнительное условие register_event("Battery", "event_set_armor", "be", "1=100")
}

public event_set_armor(id)
{
          static iArmorAmount, iArmorType

          iArmorAmount = read_data(1)   // количество брони

          iArmorType = get_pdata_int(id, OFFSET_ARMORTYPE)    //тип брони: 0 - нет брони, 1 - kevlar, 2 - kevlar+helm

          if(iArmorAmount ==? && iArmorType == ?)     //любые нужные тебе условия, вместо if можно использовать switch
             set_pev(id, pev_armorvalue, 200.0)    //установить нужное количество брони в Float
}

думаю дальше разберёшься сам




Сообщение отредактировал se7h - Среда, 01.07.2009, 23:55:28
 
KokaДата: Четверг, 02.07.2009, 12:36:13 | Сообщение # 4
Полковник
Группа: Пользователи
Сообщений: 169
Репутация: 1
Статус: Не в сети
se7h, спасибо. про батарейку я уже догодался (biohazard посмотрел), а вот "be", "1=100" точно понадобится :)

стал ощущать рефлексы тоньше, оставаясь как всегда с идеей той же...
 
slogicДата: Четверг, 02.07.2009, 13:55:22 | Сообщение # 5
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
а проверка на 100 зачем? автор просил определить назначение любой брони. кстати, если в другом плагине устанавливается броня, и не рассылается соощение через emessage, то твой плагин сообщение не получит. т.е. в идеальном случае не должно быть активных плагинов, которые модифицируют броню аналогичным способом, иначе будут конфликты.
 
se7hДата: Четверг, 02.07.2009, 15:21:47 | Сообщение # 6
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
В комментарии к наброску я разъяснил этот момент

для решения проблем с другими плагами достаточно разослать emessage 'Battery' и 'ArmorType':

Code
emessage_begin(MSG_ONE, get_user_msgid("Battery"), _, id)
ewrite_byte(x) // x - количество AP
emessage_end()

emessage_begin(MSG_ONE, get_user_msgid("ArmorType"), _, id)
ewrite_byte(x) // 0 - kevlar, 1 - kevlar+helm
emessage_end()

Добавлено (2009-07-02, 3:21 Pm)
---------------------------------------------
кстати, насчёт брони в CS был замечены глюки(?):

1) если купить kevlar+helm (1000$) и израсходовать часть брони, а потом попытаться приобрести просто kevlar (650$) значение установится в 100 как и положено, значок тоже станет соответсвующим kevlar, но проверка get_pdata_int(id, OFFSET_ARMORTYPE) даёт 2 что расносильно kevlar+helm, хотя повторюсь броня была куплена просто kevlar за 650$

2) если после того как израсходуется часть kevlar+helm попытаться снова купить такую же броню то снимется не 1000$, а 650$ как за простой kevlar




Сообщение отредактировал se7h - Четверг, 02.07.2009, 15:28:00
 
KokaДата: Четверг, 02.07.2009, 20:29:13 | Сообщение # 7
Полковник
Группа: Пользователи
Сообщений: 169
Репутация: 1
Статус: Не в сети
у меня блокирования этого события нету, только смена значение на мое, поэтому мне кажется это лишнее.

Code

new CsArmorType:stored_armor_type[33] = { CS_ARMOR_NONE, ... }

public msg_battery(msgid, dest, id)
{
  if(!g_HasAccess[id])
   return PLUGIN_CONTINUE
   
  static CsArmorType:armortype
  cs_get_user_armor(id, armortype)
   
  if(!CanChangeArmorAtUser[id] && armortype == stored_armor_type[id])
   return PLUGIN_CONTINUE
   
  if(get_msg_arg_int(1) > 0)
  {
   cs_set_user_armor(id, CurrentValue[id], armortype) // need? =/
    
   set_msg_arg_int(1, ARG_SHORT, CurrentValue[id])
    
   stored_armor_type[id] = armortype
    
   CanChangeArmorAtUser[id] = false
  }
   
  return PLUGIN_CONTINUE
}

Float:cs_get_user_armor(index, &CsArmorType:armortype)
{
  new Float:armorvalue
  pev(index, pev_armorvalue, armorvalue)
   
  static offset = 112
  armortype = CsArmorType:get_pdata_int(index, offset)
   
  return armorvalue
}

cs_set_user_armor(index, armorvalue, CsArmorType:armortype)
{
  set_pev(index, pev_armorvalue, float(armorvalue))
   
  static offset = 112
  set_pdata_int(index, offset, _:armortype)
}

кстате на счёт cs_set_user_armor(id, CurrentValue[id], armortype) // need? =/ - нужно ли это ?? (без этого не проверял, т.к. с этим надежнее :) )


стал ощущать рефлексы тоньше, оставаясь как всегда с идеей той же...
 
se7hДата: Пятница, 03.07.2009, 01:58:57 | Сообщение # 8
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
тип брони можно и не устанавливать, если тебе не нужно его изменить

 
KokaДата: Пятница, 03.07.2009, 11:59:37 | Сообщение # 9
Полковник
Группа: Пользователи
Сообщений: 169
Репутация: 1
Статус: Не в сети
я не про тип, который читается стоком по умолчанию и нужен (пока) для этого ...armortype == stored_armor_type[id]), я про то, нужно ли вообще ему менять броню через cs_set_user_armor либо достаточно оставить set_msg_arg_int. спрашиваю, т.к. лень проверять такую ерунду :))) ладно, можно закрывать, вроде все понятно теперь.

стал ощущать рефлексы тоньше, оставаясь как всегда с идеей той же...

Сообщение отредактировал Koka - Пятница, 03.07.2009, 12:00:31
 
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2024