Русское сообщество по скриптингу

Портальная пушка (Portal Gun)

Утвержденные плагины для AMX Mod X администратором/модератором форума.

Модератор: Leonidddd

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только работоспособных плагинов для AMX Mod X. Новые плагины нужно выкладывать в разделе "Новые плагины".

Портальная пушка (Portal Gun)

Сообщение Polarhigh » 23 июн 2011, 18:56

Авторы: trofian (а ещё огромная благодарность Psycrow за ресурсы)
Бета Версия: 1.9.2 beta

Описание
Плагин добавляет в игру Вы должны зарегистрироваться, чтобы видеть ссылки. из игры Portal.
Работает телепортация игроков, и любых энтить (гранаты, заложники).
Максимально точно и удобно сохраняются углы игрока и ускорение при прохождении через портал.
Встроенный анстак не даст застрять в стене, если вдруг что, так что игрок ничего не заметит.

Для переключения на портальную пушку нужно достать нож и нажать g (drop)
Для открытия меню нужно ввести в чат команду /pg или /portal_gun (для админов с флагом u)

Плагин от filip
Вы должны зарегистрироваться, чтобы видеть ссылки.
Квар: portal_cost 1000 // сколько стоит пушка


Используемые модули
Fakemeta
Hamsandwich
Engine

Нативы
Код: Выделить всё
/**
 * Выдаёт игроку портальную пушку.
 *
 * @param       id      - id игрока, кому выдать портальную пушку
 * @return              - 0, если пушка уже есть, 1 - всё ок, выдали
 */
native pg_give(const id)
 
/**
 * Забирает у игрока портальную пушку.
 *
 * @param       id      - id игрока, у кого забрать портальную пушку
 * @return              - 0, если пушки и так нету, 1 - всё ок, забрали
 */
native pg_remove(const id)
 
/**
 * Проверяет - может ли игрок переключиться на портальную пушку.
 *
 * @param       id      - id игрока для проверки
 * @return              - 1 - есть, 0 - нету
 */
native pg_is_have(const id)
 
/**
 * Если в данный момент у игрока вместо ножа портальна пушка - вернёт 1
 * Причём вернёт 1 даже если в руках какое-то другое оружие (например пистолет)
 *
 * @param       id      - id игрока для проверки
 * @return              - 1 - есть, 0 - нету
 */
native pg_is_in_hand(const id)
 
/**
 * Удаляет портал игрока.
 *
 * @param       id              - id игрока для проверки
 * @param       portal  - тип портала 's' - синий (правая кнопка мыши), 'e' - оранжевый (левая кнопка мыши), 'a' - оба
 * @return                      - 1 - удалено, 0 - не удалено, т.к. у игрока нет портальной пушки, либо параметр portal неправильный
 */
native pg_delete_portal(const id, const portal)


Исторя версий
Код: Выделить всё
1.9.0 beta
Видимый функционал не поменялся, разве что кое-где кое-что поточнее работает
* убрал натив native pg_get_portal_id(const id, const portal)
* убрал загрузку неиспользуемой мировой модели, а так ресурсы используются старые
* можно сказать, что эта версия заготовка второй версии портальной пушки), куда хотел бы добавить всякие вещи, о которых писал раньше в этой теме. Это будет очень не скоро.

1.9.1 beta
* пофиксил застревания
* немного поменял расчёты, заложники например нормально телепортируются, другие энтити должны тоже нормально телепортироваться

1.9.2 beta
* фикс зависания сервера


Ресурсы (модели, звуки, спрайты)
Вы должны зарегистрироваться, чтобы видеть ссылки. (1,4 мб)
Вы должны зарегистрироваться, чтобы видеть ссылки. (719 кб)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Polarhigh 08 апр 2016, 04:12, всего редактировалось 74 раз(а).
Аватара пользователя
Polarhigh
 
Сообщения: 1006
Зарегистрирован: 04 май 2010, 17:41
Благодарил (а): 131 раз.
Поблагодарили: 388 раз.
Опыт программирования: Больше трех лет

Re: Портальная пушка (Portal Gun)

Сообщение cs-portal » 12 июл 2011, 16:25

польская версия тестировалась при 32 игроках
застревания были но редко. в таком мясе с респаунами ето не проблема была.
вот фризы сервера раздражали.
Аватара пользователя
cs-portal
 
Сообщения: 228
Зарегистрирован: 08 июн 2010, 23:56
Благодарил (а): 12 раз.
Поблагодарили: 9 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

Re: Портальная пушка (Portal Gun)

Сообщение svida » 25 июл 2011, 21:11

последняя версия
Вы должны зарегистрироваться, чтобы видеть ссылки.
на русском
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <hamsandwich>
#include <fakemeta>
#include <engine>
#include <xs>
#include <cstrike>

#define PLUGIN "Portal"
#define VERSION "1.0"
#define AUTHOR "DarkGL & R3X"

#define SOUNDS
#define SPRITES
//#define TEST
//#define TRACE_HULL

#define MAX 32
#define IsPlayer(%1) (1<=%1<=MAX)

new const szClassNameNieb[] = "portal_shot_niebieski"
new const szClassNamePom[] = "portal_shot_pomaranczowy"
new const szClassTelNieb[] = "teleport_nieb";
new const szClassTelPom[] = "teleport_pom";
new const v_model[] = "models/portal/v_portal.mdl";
new const portal[] = "models/portal/portal.mdl";
new const w_model[] = "models/rpgrocket.mdl";

#if defined SOUNDS
new const portal_shot_blue[] = "portal/portalgun_shoot_blue1.wav"
new const portal_shot_red[] = "portal/portalgun_shoot_red1.wav"
new const soundOpen[][]={
   "portal/portal_open1.wav",
   "portal/portal_open2.wav",
   "portal/portal_open3.wav"
}
new const soundClose[][]={
   "portal/portal_close1.wav",
   "portal/portal_close2.wav"
}
new const soundEnter[][]={
   "portal/portal_enter1.wav",
   "portal/portal_enter2.wav"
}
new const soundInvalid[]= "portal/portal_invalid_surface3.wav";
#endif

new player_ent[MAX+1]
new Float:fNextAttack[MAX+1]
new bool:bMode[MAX+1]
new iEnt[MAX+1][2];
new iTel[MAX+1][2]

#define OFFSET_WEAPONOWNER 41
#define OFFSET_LINUX_WEAPONS 4
#define OFFSET_ACTIVEITEM 374
#define OFFSET_LINUX_PLAYER 5

#define m_flNextPrimaryAttack 46
#define m_flNextSecondaryAttack 47

new const szClassTouch[][]={
   "worldspawn",
   "func_wall",
   "func_door",
   "func_door_rotating",
   "func_breakable"
}

#define  MAX_DISTANCE 70.0
#define  MIN_DISTANCE 50.0

#if defined SPRITES
new sprite;
new g_trail;
new spriteInvalid[2];
#endif

enum eCvar{
   SpriteType,
   FallDamge,
   SpeedBullet,
   PortalCost,
   SpawnPortal
}

new pCvars[eCvar]

public plugin_init() {
   register_plugin(PLUGIN, VERSION, AUTHOR)
   
   RegisterHam(Ham_Killed,"player","ham_KilledPost",1)
   RegisterHam( Ham_TakeDamage, "player", "ham_damage" );
   RegisterHam(Ham_Spawn,"player","ham_Spawned",1)
   
   register_logevent("Koniec_Rundy", 2, "1=Round_End")
   
   register_forward(FM_CmdStart,"fwd_CmdStart")
   
   register_touch(szClassTelPom,"*","touchTeleport")
   register_touch(szClassTelNieb,"*","touchTeleport")
   
   for(new i = 0;i<sizeof szClassTouch;i++){   
      register_touch(szClassTouch[i],szClassNameNieb,"touchNieb")
      register_touch(szClassTouch[i],szClassNamePom,"touchPom")
   }
   
   register_clcmd("say /portal","buyPortal");
   register_clcmd("drop","cmdDrop")
   
   register_clcmd("give_portal","give_weapon",ADMIN_CFG,"<nick>")
   
   return PLUGIN_CONTINUE;
}

public ham_Spawned(id){
   if(!is_user_alive(id)){
      return HAM_IGNORED;
   }
   if(get_pcvar_num(pCvars[SpawnPortal]) && !pev_valid(player_ent[id])){
      new szWeaponName[64],bool:bContinue = false;
      new num, iWeapons[32]
      
      get_user_weapons(id, iWeapons, num)
      for(new i = 1;i<=30;i++){
         if(i == 2 || i == 4 || i == 6 || i == 9 || i == 25 || i == 29){
            continue;
         }
         bContinue = false;
         for (new j=0; j<num; j++)
         {
            if(iWeapons[j] == i){
               bContinue = true;
               break;
            }
         }
         if(!bContinue){
            get_weaponname(i,szWeaponName,charsmax(szWeaponName));
            player_ent[id] = give_item(id,szWeaponName)
            RegisterHamFromEntity(Ham_Item_Deploy,player_ent[id],"ham_ItemDeploy_Post",1)
            set_pdata_float(player_ent[id], m_flNextPrimaryAttack, 99999.0, OFFSET_LINUX_WEAPONS)
            set_pdata_float(player_ent[id], m_flNextSecondaryAttack, 99999.0, OFFSET_LINUX_WEAPONS)
            break;
         }
      }
      
   }
   return HAM_IGNORED;
}

public buyPortal(id){
   new cost = get_pcvar_num(pCvars[PortalCost]);
   if(cost < 0){
      return PLUGIN_HANDLED;
   }
   if(cs_get_user_money(id) < cost){
      client_print(id,print_console,"У тебя слишком мало денег");
   }
   else
   {
      if(!is_user_alive(id)){
         client_print(id,print_console,"Вы должны быть живы");
         return PLUGIN_HANDLED
      }
      if(pev_valid(player_ent[id])){
         client_print(id,print_console,"У вас уже есть PortalGun");
         return PLUGIN_HANDLED
      }
      new szWeaponName[64],bool:bContinue = false;
      new num, iWeapons[32]
      
      get_user_weapons(id, iWeapons, num)
      for(new i = 1;i<=30;i++){
         if(i == 2 || i == 4 || i == 6 || i == 9 || i == 25 || i == 29){
            continue;
         }
         bContinue = false;
         for (new j=0; j<num; j++)
         {
            if(iWeapons[j] == i){
               bContinue = true;
               break;
            }
         }
         if(!bContinue){
            get_weaponname(i,szWeaponName,charsmax(szWeaponName));
            player_ent[id] = give_item(id,szWeaponName)
            RegisterHamFromEntity(Ham_Item_Deploy,player_ent[id],"ham_ItemDeploy_Post",1)
            set_pdata_float(player_ent[id], m_flNextPrimaryAttack, 99999.0, OFFSET_LINUX_WEAPONS)
            set_pdata_float(player_ent[id], m_flNextSecondaryAttack, 99999.0, OFFSET_LINUX_WEAPONS)
            break;
         }
      }
      cs_set_user_money(id,cs_get_user_money(id) - cost,0);
      
   }
   return PLUGIN_HANDLED;
}

public ham_damage( this, inflictor, attacker, Float:damage, damagebits )
{
   if( !( damagebits & DMG_FALL ) || !IsPlayer(this))
   return HAM_IGNORED;
   
   new bool:bCvar = !(!get_pcvar_num(pCvars[FallDamge]))
   
   if(!bCvar || (bCvar && !pev_valid(player_ent[this]))){
      return HAM_IGNORED;
   }
   
   return HAM_SUPERCEDE;
}

public Koniec_Rundy()
{
   remove_entity_name(szClassTelPom)
   remove_entity_name(szClassTelNieb)
   for(new i = 1;i<=MAX;i++){
      iTel[i][0] = 0;
      iTel[i][1] = 0;
   }
}

public touchTeleport(portal,id){
   if(pev_valid(id)){
      if(pev(id,pev_movetype) == MOVETYPE_FOLLOW){
         return PLUGIN_CONTINUE;
      }
      static szClassName[64];
      pev(id,pev_classname,szClassName,charsmax(szClassName));
      if(equal(szClassName,szClassTelPom) || equal(szClassName,szClassTelNieb) || equal(szClassName,szClassNameNieb) || equal(szClassName,szClassNamePom)){
         return PLUGIN_CONTINUE;
      }
      moveTo(id,portal,pev(portal,pev_iuser1))
   }
   return PLUGIN_CONTINUE;
}


moveTo(id, in, out){
   if(pev_valid(out)){
      #if defined TRACE_HULL
      new hull = HULL_POINT;
      
      if(is_user_alive(id)){
         hull = HULL_HUMAN;
      }
      #endif
      
      new Float:fDistance = MIN_DISTANCE;
      while(fDistance <= MAX_DISTANCE){
         new Float:fOrigin[3];
         pev(out, pev_origin, fOrigin);
         
         new Float:fAngles[3];
         pev(out, pev_vuser1, fAngles);
         
         xs_vec_mul_scalar(fAngles, fDistance, fAngles);
         xs_vec_add(fOrigin, fAngles, fOrigin);
         
         new Float:fMins[3],Float:fMaxs[3];
         pev(id,pev_mins,fMins);
         pev(id,pev_maxs,fMaxs);
         
         
         
         #if defined TRACE_HULL
         if(!trace_hull(fOrigin, hull, id, 0)){
            #else
            if(checkPortalPlace(fOrigin,fMins,fMaxs)){
               #endif
               set_pev(id, pev_origin, fOrigin);
               
               #if defined SOUNDS
               engfunc(EngFunc_EmitAmbientSound, 0,fOrigin, soundEnter[random(sizeof soundEnter)],VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
               #endif
               
               parseAngle(id, in, out);
               
               break;
            }
            fDistance += 10.0;
         }
      }
   }

   public fwd_CmdStart(id, uc_handle, seed) {
      if(!is_user_alive(id) || player_ent[id] != get_pdata_cbase(id,OFFSET_ACTIVEITEM,OFFSET_LINUX_PLAYER)){
         return FMRES_IGNORED;
      }
      
      new buttons = get_uc(uc_handle,UC_Buttons)
      new oldbuttons = get_user_oldbutton(id);
      
      if(buttons&IN_ATTACK && fNextAttack[id] < get_gametime()){
         fNextAttack[id] = get_gametime() + 0.5;
         create_shot_portal(id);
         set_animation(id,random_num(1,2))
      }
      if(buttons & IN_ATTACK2 && !(oldbuttons & IN_ATTACK2)){
         bMode[id] = !bMode[id];
         client_print(id,print_center,"Режим %s",bMode[id] ? "Синий":"Оранжевый")
      }
      return FMRES_HANDLED
   }

   public plugin_precache(){
      
      cvar_register();
      
      precache_model(v_model);
      precache_model(portal);
      precache_model(w_model);
      #if defined SPRITES
      sprite = precache_model("sprites/white.spr");
      g_trail = precache_model("sprites/smoke.spr")
      spriteInvalid[0] = precache_model("sprites/portal/pom.spr") ;
      spriteInvalid[1] = precache_model("sprites/portal/nieb.spr") ;
      #endif
      
      #if defined SOUNDS
      precache_sound(portal_shot_blue)
      precache_sound(portal_shot_red);
      for(new i = 0 ; i<sizeof soundOpen;i++){
         precache_sound(soundOpen[i])
      }
      for(new i = 0 ; i<sizeof soundClose;i++){
         precache_sound(soundClose[i])
      }
      for(new i = 0 ; i<sizeof soundEnter;i++){
         precache_sound(soundEnter[i])
      }
      precache_sound(soundInvalid)
      #endif
      
      new szConfDir[64],szFullDir[128];
      get_configsdir(szConfDir,charsmax(szConfDir));
      formatex(szFullDir,charsmax(szFullDir),"%s/portal.cfg",szConfDir);
      if(!file_exists(szFullDir)){
         #if defined SPRITES
         write_file(szFullDir,"// 1 or 2 difrent sprites 0 off this")
         write_file(szFullDir,"portal_sprite 2");
         #endif
         
         write_file(szFullDir,"// 1 - no fall damage 0 - normal (no fall damage for person who have portal gun)")
         write_file(szFullDir,"portal_fall_damage 1");
         
         write_file(szFullDir,"// speed of portal bullet")
         write_file(szFullDir,"portal_bullet_speed 1500");
         
         write_file(szFullDir,"//how much money you must have to buy portal with /portal command in say number of negative side off this")
         write_file(szFullDir,"portal_cost 16000");
         
         write_file(szFullDir,"//portal gun for free on spawn ?")
         write_file(szFullDir,"portal_spawn 0")
      }
      server_cmd("exec %s",szFullDir)
      
   }

   public client_connect(id){
      player_ent[id] = 0;
      iTel[id][0] = 0;
      iTel[id][1] = 0;
   }

   public client_disconnect(id){
      player_ent[id] = 0;
      iTel[id][0] = 0;
      iTel[id][1] = 0;
   }

   public touchNieb(touched,toucher){
      if(!pev_valid(toucher)){
         remove_entity(toucher)
         return PLUGIN_CONTINUE;
      }
      
      missileTouche(toucher,0);
      
      return PLUGIN_CONTINUE;
   }

   public touchPom(touched,toucher){   
      if(!pev_valid(toucher)){
         remove_entity(toucher)
         return PLUGIN_CONTINUE;
      }
      
      missileTouche(toucher,1);
      
      return PLUGIN_CONTINUE;
   }

   public missileTouche(iEntLocal,iPos){
      new Float:fOrigin[3],iOwner;
      
      pev(iEntLocal,pev_origin,fOrigin);
      
      iOwner = pev(iEntLocal,pev_owner);
      
      new Float:fVelo[3],Float:fEndOrigin[3];
      
      pev(iEntLocal, pev_velocity, fVelo)
      
      xs_vec_normalize(fVelo,fVelo)
      
      xs_vec_mul_scalar(fVelo,50.0,fVelo);
      
      xs_vec_add(fOrigin,fVelo,fEndOrigin);
      
      new ptr = create_tr2()
      
      new Float:vfNormal[3]
      
      engfunc(EngFunc_TraceLine, fOrigin, fEndOrigin, IGNORE_MISSILE | IGNORE_MONSTERS | IGNORE_GLASS, iEntLocal, ptr)
      
      get_tr2(ptr, TR_vecPlaneNormal, vfNormal);
      
      new Float:fOrigin3[3];
      get_tr2(ptr, TR_vecEndPos, fOrigin3);
      
      free_tr2(ptr)
      
      if(!validWall(fOrigin3,vfNormal) || !checkPlace(fOrigin3,iPos,iOwner)){
         #if defined SOUNDS
         engfunc(EngFunc_EmitAmbientSound, 0,fOrigin3, soundInvalid,VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
         #endif
         
         pev(iEntLocal, pev_velocity, fVelo)
         
         xs_vec_normalize(fVelo,fVelo)
         
         xs_vec_mul_scalar(fVelo,-4.0,fVelo);
         xs_vec_add(fOrigin,fVelo,fOrigin3);
         
         #if defined SPRITES
         for(new i = 1; i < 6; i++) {
            engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, fOrigin3,0)
            write_byte(TE_SPRITETRAIL)
            engfunc(EngFunc_WriteCoord, fOrigin3[0])
            engfunc(EngFunc_WriteCoord, fOrigin3[1])
            engfunc(EngFunc_WriteCoord, fOrigin3[2])
            engfunc(EngFunc_WriteCoord, fOrigin3[0])
            engfunc(EngFunc_WriteCoord, fOrigin3[1])
            engfunc(EngFunc_WriteCoord, fOrigin3[2] + 10)
            write_short(iPos == 0 ? spriteInvalid[1] : spriteInvalid[0])
            write_byte(2)
            write_byte(1)
            write_byte(1)
            write_byte(random_num(5,10))
            write_byte(5)
            message_end()
         }
         #endif
         
         remove_entity(iEntLocal);
         return PLUGIN_CONTINUE;
      }
      
      new Float:fOldNormal[3];
      xs_vec_copy(vfNormal, fOldNormal);
      
      vector_to_angle(vfNormal, vfNormal);
      
      //cosik
      pev(iEntLocal, pev_velocity, fVelo)
      
      xs_vec_normalize(fVelo,fVelo)
      
      xs_vec_mul_scalar(fVelo,-4.0,fVelo);
      xs_vec_add(fOrigin,fVelo,fOrigin);
      //
      
      remove_entity(iEntLocal);
      
      iEnt[iOwner][iPos] = 0;
      
      if(pev_valid(iTel[iOwner][iPos])){
         new Float:fOrigin2[3];
         pev(iTel[iOwner][iPos],pev_origin,fOrigin2)
         #if defined SOUNDS
         engfunc(EngFunc_EmitAmbientSound, 0,fOrigin2, soundClose[random(sizeof soundClose)],VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
         #endif
         remove_entity(iTel[iOwner][iPos]);
         iTel[iOwner][iPos] = 0;
      }
      
      iTel[iOwner][iPos] =  engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
      
      set_pev(iTel[iOwner][iPos],pev_classname,iPos == 0 ? szClassTelNieb : szClassTelPom);
      
      set_pev(iTel[iOwner][iPos],pev_origin,fOrigin);
      
      set_pev(iTel[iOwner][iPos],pev_solid,SOLID_TRIGGER)
      set_pev(iTel[iOwner][iPos],pev_movetype,MOVETYPE_FLY)
      
      engfunc(EngFunc_SetModel, iTel[iOwner][iPos], portal)
      
      set_pev(iTel[iOwner][iPos],pev_skin,iPos == 0 ? 0 : 1);
      
      #if defined SOUNDS
      engfunc(EngFunc_EmitAmbientSound, 0,fOrigin, soundOpen[random(sizeof soundOpen)],VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
      #endif
      
      new Float:fMins[3],Float:fMax[3],Float:mul[3];
      
      mul[0] = floatabs(floatabs(fOldNormal[0])-1.0)
      mul[0] = mul[0] + 0.1 > 1.0 ? mul[0]:mul[0]+0.1
      
      mul[1] = floatabs(floatabs(fOldNormal[1])-1.0)
      mul[1] = mul[1] + 0.1 > 1.0 ? mul[1]:mul[1]+0.1
      
      mul[2] = floatabs(floatabs(fOldNormal[2])-1.0)
      mul[2] = mul[2] + 0.1 > 1.0 ? mul[2]:mul[2]+0.1
      
      fMins[0] = floatmul(mul[0],-20.0)-2.0;
      fMins[1] = floatmul(mul[1],-10.0)-2.0;
      fMins[2] = floatmul(mul[2],-42.0)-2.0
      
      fMax[0] = floatmul(mul[0],20.0)+2.0;
      fMax[1] = floatmul(mul[1],10.0)+2.0;
      fMax[2] = floatmul(mul[2],42.0)+2.0
      
      engfunc(EngFunc_SetSize, iTel[iOwner][iPos],fMins, fMax)
      
      set_pev(iTel[iOwner][iPos], pev_angles, vfNormal);
      
      set_pev(iTel[iOwner][iPos],pev_iuser1,iTel[iOwner][iPos == 0 ? 1 : 0]);
      
      if(pev_valid(iTel[iOwner][iPos == 0 ? 1 : 0]) && !pev_valid(pev(iTel[iOwner][iPos == 0 ? 1 : 0],pev_iuser1))){
         set_pev(iTel[iOwner][iPos == 0 ? 1 : 0],pev_iuser1,iTel[iOwner][iPos])
      }
      
      set_pev(iTel[iOwner][iPos], pev_vuser1, fOldNormal);
      
      set_pev(iTel[iOwner][iPos],pev_owner,iOwner);
      
      return PLUGIN_CONTINUE;
   }

   public give_weapon(id,level,cid){
      if(!cmd_access(id,level,cid,2)){
         return PLUGIN_HANDLED;
      }
      new szString[64];
      read_argv(1,szString,charsmax(szString));
      new find = find_player("bl",szString);
      if(!find){
         client_print(id,print_console,"[Portal Gun] я не могу найти такого игрока");
         return PLUGIN_HANDLED;
      }
      else
      {
         if(!is_user_alive(find)){
            client_print(id,print_console,"[Portal Gun] Игрок должен быть живым");
            return PLUGIN_HANDLED
         }
         new szName[64];
         get_user_name(find,szName,charsmax(szName));
         if(pev_valid(player_ent[find])){
            client_print(id,print_console,"[Portal Gun] %s уже есть PortalGun",szName);
            return PLUGIN_HANDLED
         }
         else
         {
            client_print(id,print_console,"[Portal Gun] портал %s",szName);
         }
      }
      new szWeaponName[64],bool:bContinue = false;
      new num, iWeapons[32]
      
      get_user_weapons(id, iWeapons, num)
      for(new i = 1;i<=30;i++){
         if(i == 2 || i == 4 || i == 6 || i == 9 || i == 25 || i == 29){
            continue;
         }
         bContinue = false;
         for (new j=0; j<num; j++)
         {
            if(iWeapons[j] == i){
               bContinue = true;
               break;
            }
         }
         if(!bContinue){
            get_weaponname(i,szWeaponName,charsmax(szWeaponName));
            player_ent[id] = give_item(id,szWeaponName)
            RegisterHamFromEntity(Ham_Item_Deploy,player_ent[id],"ham_ItemDeploy_Post",1)
            set_pdata_float(player_ent[id], m_flNextPrimaryAttack, 99999.0, OFFSET_LINUX_WEAPONS)
            set_pdata_float(player_ent[id], m_flNextSecondaryAttack, 99999.0, OFFSET_LINUX_WEAPONS)
            break;
         }
      }
      return PLUGIN_HANDLED;
   }

   public ham_ItemDeploy_Post(weapon_ent)
   {
      static owner
      owner = get_pdata_cbase(weapon_ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS);
      
      if(!is_user_alive(owner)){
         return HAM_IGNORED;
      }
      set_pev(owner,pev_viewmodel2,v_model);
      
      set_animation(owner,6)
      return HAM_IGNORED;
   }

   public ham_KilledPost(id){
      if(is_user_connected(id)){
         player_ent[id] = 0;
      }
   }


   public cmdDrop(id){
      if(player_ent[id] == get_pdata_cbase(id,OFFSET_ACTIVEITEM,OFFSET_LINUX_PLAYER)){
         return PLUGIN_HANDLED;
      }
      return PLUGIN_CONTINUE;
   }

   public create_shot_portal(id){
      new iPos = bMode[id] ? 0 : 1;
      if(pev_valid(iEnt[id][iPos]) && pev(iEnt[id][iPos],pev_owner) == id){
         engfunc(EngFunc_RemoveEntity,iEnt[id][iPos])
         iEnt[id][iPos] = 0;
      }
      iEnt[id][iPos] =  engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
      
      if(!pev_valid(iEnt[id][iPos])){
         return PLUGIN_CONTINUE;
      }
      
      set_pev(iEnt[id][iPos],pev_classname,bMode[id] ? szClassNameNieb : szClassNamePom);
      
      new Float:Origin[3], Float: vAngle[3], Float: Velocity[3];
      
      pev(id,pev_v_angle,vAngle)
      
      new iOrigin[3];
      get_user_origin(id,iOrigin,1)
      IVecFVec(iOrigin,Origin)
      
      #if defined SOUNDS
      engfunc(EngFunc_EmitAmbientSound, 0,Origin, bMode[id] ? portal_shot_blue : portal_shot_red,VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
      #endif
      
      set_pev(iEnt[id][iPos],pev_origin,Origin);
      
      vAngle[0] *= -1.0;
      
      set_pev(iEnt[id][iPos],pev_angles,vAngle)
      
      set_pev(iEnt[id][iPos],pev_solid,SOLID_TRIGGER)
      set_pev(iEnt[id][iPos],pev_movetype,MOVETYPE_FLY)
      
      VelocityByAim(id, get_pcvar_num(pCvars[SpeedBullet]) , Velocity);
      
      set_pev(iEnt[id][iPos],pev_owner,id)
      
      set_pev(iEnt[id][iPos],pev_velocity,Velocity)
      
      engfunc(EngFunc_SetModel, iEnt[id][iPos], w_model)
      
      engfunc(EngFunc_SetSize, iEnt[id][iPos], {-1.0, -1.0, -1.0}, {1.0, 1.0, 1.0})
      
      set_rendering(iEnt[id][iPos], kRenderFxGlowShell, bMode[id] ? 0:255,bMode[id] ? 0:165,bMode[id] ? 255:0, kRenderTransColor, 1)
      
      #if defined SPRITES
      new iMode = get_pcvar_num(pCvars[SpriteType]);
      if(iMode){
         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
         write_byte(TE_BEAMFOLLOW)
         write_short(iEnt[id][iPos])
         write_short(iMode == 1 ? sprite:g_trail);
         write_byte(10)
         write_byte(5)
         if(bMode[id]){
            write_byte(0)
            write_byte(0)
            write_byte(255)
         }
         else{
            write_byte(255)
            write_byte(165)
            write_byte(0)
         }
         write_byte(192)
         message_end()
      }
      #endif
      
      return PLUGIN_CONTINUE;
   }


   stock bool:validWall(const Float:fOrigin[3], Float:fNormal[3], Float:width=40.0, Float:height = 65.0){
      new Float:fInvNormal[3];
      xs_vec_neg(fNormal, fInvNormal);
      
      new Float:fPoint[3];
      xs_vec_add(fOrigin, fNormal, fPoint);
      
      new Float:fNormalUp[3];
      new Float:fNormalRight[3];
      vector_to_angle(fNormal, fNormalUp);
      
      fNormalUp[0] = -fNormalUp[0];
      
      angle_vector(fNormalUp, ANGLEVECTOR_RIGHT, fNormalRight);
      angle_vector(fNormalUp, ANGLEVECTOR_UP, fNormalUp);
      
      xs_vec_mul_scalar(fNormalUp, height/2, fNormalUp);
      xs_vec_mul_scalar(fNormalRight, width/2, fNormalRight);
      
      new Float:fPoint2[3];
      xs_vec_add(fPoint, fNormalUp, fPoint2);
      xs_vec_add(fPoint2, fNormalRight, fPoint2);
      if(!traceToWall(fPoint2, fInvNormal))
      return false;
      
      xs_vec_add(fPoint, fNormalUp, fPoint2);
      xs_vec_sub(fPoint2, fNormalRight, fPoint2);
      if(!traceToWall(fPoint2, fInvNormal))
      return false;
      
      xs_vec_sub(fPoint, fNormalUp, fPoint2);
      xs_vec_sub(fPoint2, fNormalRight, fPoint2);
      if(!traceToWall(fPoint2, fInvNormal))
      return false;
      
      xs_vec_sub(fPoint, fNormalUp, fPoint2);
      xs_vec_add(fPoint2, fNormalRight, fPoint2);
      if(!traceToWall(fPoint2, fInvNormal))
      return false;
      
      return true;
   }

bool:traceToWall(const Float:fOrigin[3], const Float:fVec[3]){
      new Float:fOrigin2[3];
      xs_vec_add(fOrigin, fVec, fOrigin2);
      xs_vec_add(fOrigin2, fVec, fOrigin2);
      
      new tr = create_tr2();
      engfunc(EngFunc_TraceLine, fOrigin, fOrigin2, IGNORE_MISSILE | IGNORE_MONSTERS | IGNORE_GLASS, 0, tr);
      new Float:fFrac;
      get_tr2(tr, TR_flFraction, fFrac);
      free_tr2(tr);
      
      if( floatabs(fFrac - 0.5) <= 0.02 ){
         return true;
      }
      
      return false;
   }

   set_animation(id, anim) {
      set_pev(id, pev_weaponanim, anim)
      
      message_begin(MSG_ONE, SVC_WEAPONANIM, {0, 0, 0}, id)
      write_byte(anim)
      write_byte(pev(id, pev_body))
      message_end()
   }

   parseAngle(id, in, out){
      new Float:fAngles[3];
      pev(id, pev_v_angle, fAngles);
      angle_vector(fAngles, ANGLEVECTOR_FORWARD, fAngles);
      
      new Float:fNormalIn[3];
      pev(in, pev_vuser1, fNormalIn);
      xs_vec_neg(fNormalIn, fNormalIn);
      
      new Float:fNormalOut[3];
      pev(out, pev_vuser1, fNormalOut);
      
      xs_vec_sub(fAngles, fNormalIn, fAngles);
      xs_vec_add(fAngles, fNormalOut, fAngles);
      
      //fAngles[2] = -fAngles[2];
      
      vector_to_angle(fAngles, fAngles);
      
      set_pev(id, pev_angles, fAngles);
      set_pev(id, pev_fixangle, 1);
      
      
      pev(id, pev_velocity, fAngles);
      new Float:fSpeed = vector_length(fAngles);
      xs_vec_normalize(fAngles,  fAngles);
      
      xs_vec_sub(fAngles, fNormalIn, fAngles);
      xs_vec_add(fAngles, fNormalOut, fAngles);
      
      xs_vec_normalize(fAngles, fAngles);
      xs_vec_mul_scalar(fAngles, fSpeed, fAngles);
      set_pev(id, pev_velocity, fAngles);
   }

bool:checkPlace(Float:fOrigin[3],iMode,id){
      new ent = -1;
      new szClass[64]
      while((ent = find_ent_in_sphere(ent,fOrigin,45.0))){
         pev(ent,pev_classname,szClass,charsmax(szClass));
         if(equal(szClass,szClassTelNieb) || equal(szClass,szClassTelPom)){
            if(iMode == 0 && equal(szClass,szClassTelNieb) && pev(ent,pev_owner) == id){
               continue;
            }
            else if(iMode == 1 && equal(szClass,szClassTelPom) && pev(ent,pev_owner) == id){
               continue;
            }
            else{
               return false;
            }
         }
      }
      return true;
   }

   public cvar_register(){
      #if defined SPRITES
      pCvars[SpriteType] = register_cvar("portal_sprite","2")
      #endif
      pCvars[FallDamge] = register_cvar("portal_fall_damage","1")
      pCvars[SpeedBullet] = register_cvar("portal_bullet_speed","1500")
      pCvars[PortalCost] = register_cvar("portal_cost","16000")
      pCvars[SpawnPortal] = register_cvar("portal_spawn","0")
   }

bool:checkPortalPlace(Float: fOrigin[3],Float: fMins[3],Float: fMaxs[3]){
      new Float:fOriginTmp[3]
      
      xs_vec_copy(fOrigin,fOriginTmp)
      
      
      fOriginTmp[0] += fMins[0];
      fOriginTmp[1] += fMaxs[1];
      fOriginTmp[2] += fMaxs[2];
      if(!traceTo(fOrigin,fOriginTmp)){
         return false;
      }
      xs_vec_copy(fOrigin,fOriginTmp)
      
      
      fOriginTmp[0] += fMaxs[0];
      fOriginTmp[1] += fMaxs[1];
      fOriginTmp[2] += fMaxs[2];
      if(!traceTo(fOrigin,fOriginTmp)){
         return false;
      }
      xs_vec_copy(fOrigin,fOriginTmp)
      
      
      fOriginTmp[0] += fMins[0];
      fOriginTmp[1] += fMins[1];
      fOriginTmp[2] += fMaxs[2];
      if(!traceTo(fOrigin,fOriginTmp)){
         return false;
      }
      xs_vec_copy(fOrigin,fOriginTmp)
      
      fOriginTmp[0] += fMaxs[0];
      fOriginTmp[1] += fMins[1];
      fOriginTmp[2] += fMaxs[2];
      if(!traceTo(fOrigin,fOriginTmp)){
         return false;
      }
      xs_vec_copy(fOrigin,fOriginTmp)
      
      fOriginTmp[0] += fMins[0];
      fOriginTmp[1] += fMaxs[1];
      fOriginTmp[2] += fMins[2];
      if(!traceTo(fOrigin,fOriginTmp)){
         return false;
      }
      xs_vec_copy(fOrigin,fOriginTmp)
      
      fOriginTmp[0] += fMaxs[0];
      fOriginTmp[1] += fMaxs[1];
      fOriginTmp[2] += fMins[2];
      if(!traceTo(fOrigin,fOriginTmp)){
         return false;
      }
      xs_vec_copy(fOrigin,fOriginTmp)
      
      fOriginTmp[0] += fMins[0];
      fOriginTmp[1] += fMins[1];
      fOriginTmp[2] += fMins[2];
      if(!traceTo(fOrigin,fOriginTmp)){
         return false;
      }
      xs_vec_copy(fOrigin,fOriginTmp)
      
      fOriginTmp[0] += fMaxs[0];
      fOriginTmp[1] += fMins[1];
      fOriginTmp[2] += fMins[2];
      if(!traceTo(fOrigin,fOriginTmp)){
         return false;
      }
      xs_vec_copy(fOrigin,fOriginTmp)
      
      return true;
   }

bool:traceTo(const Float:fFrom[3],const Float:fTo[3]){
      new tr = create_tr2();
      
      engfunc(EngFunc_TraceLine, fFrom, fTo,0, 0, tr);
      
      new Float:fFrac;
      get_tr2(tr, TR_flFraction, fFrac);
      free_tr2(tr);
      
      return (fFrac == 1.0)
      
   }

#if defined TEST
   Create_Line(const Float:start[3], const Float:stop[3], Float:go=10.0, r=0,g=0,b=255)
   {
      new Float:fStart[3], Float:fStop[3];
      new Float:fVec[3];
      xs_vec_sub(start, stop, fVec);
      xs_vec_normalize(fVec, fVec);

      xs_vec_mul_scalar(fVec, go, fVec);

      xs_vec_add(stop, fVec, fStop);
      xs_vec_sub(start, fVec, fStart);


      message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
      write_byte(0)
      engfunc(EngFunc_WriteCoord, fStart[0])
      engfunc(EngFunc_WriteCoord,fStart[1])
      engfunc(EngFunc_WriteCoord,fStart[2])

      engfunc(EngFunc_WriteCoord,fStop[0])
      engfunc(EngFunc_WriteCoord,fStop[1])
      engfunc(EngFunc_WriteCoord,fStop[2])
      write_short(sprite)
      write_byte(1)
      write_byte(5)
      write_byte(1)//life
      write_byte(10)
      write_byte(0)
      write_byte(r)   // RED
      write_byte(g)   // GREEN
      write_byte(b)   // BLUE               
      write_byte(250)   // brightness
      write_byte(5)
      message_end()
   }
#endif
   /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
*/
[url="http://svida.at.ua/forum"][/url]
Аватара пользователя
svida
 
Сообщения: 40
Зарегистрирован: 25 июн 2010, 17:59
Откуда: Kiev
Благодарил (а): 8 раз.
Поблагодарили: 3 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

Re: Портальная пушка (Portal Gun)

Сообщение Skillax » 25 июл 2011, 21:26

svida, [pawn]
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <hamsandwich>
#include <fakemeta>
#include <engine>
#include <xs>
#include <cstrike>
 
[/pawn]

ну и жуть... Я такое даже и тестить не стал. все и так видно.
Аватара пользователя
Skillax
 
Сообщения: 273
Зарегистрирован: 29 мар 2011, 11:57
Благодарил (а): 36 раз.
Поблагодарили: 45 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: Портальная пушка (Portal Gun)

Сообщение Vovan k. » 25 июл 2011, 21:59

ну и что тебя здесь смущает?
Аватара пользователя
Vovan k.
 
Сообщения: 248
Зарегистрирован: 24 апр 2010, 20:52
Откуда: Украина
Благодарил (а): 19 раз.
Поблагодарили: 52 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6
Другое:
C#/C++
PHP/MySQL

Re: Портальная пушка (Portal Gun)

Сообщение noo00oob » 25 июл 2011, 22:21

Видно то, что делали знающие люди, а, к сожелению, Skillax к таковым не относится.
Один фрукт, страдающий недостачей времени, нашел его ради меня любимого и писал(а):
noo00oob, зачем родился на свет вообще? срать на форумах это понятно.. больше изъеба не найти как бэ? а то, что ты недоношенная скотина, сдерживайся, детка.
noo00oob
 
Сообщения: 1061
Зарегистрирован: 09 янв 2010, 21:52
Благодарил (а): 258 раз.
Поблагодарили: 395 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Портальная пушка (Portal Gun)

Сообщение Skillax » 25 июл 2011, 23:27

noo00oob, :lol2:
Аватара пользователя
Skillax
 
Сообщения: 273
Зарегистрирован: 29 мар 2011, 11:57
Благодарил (а): 36 раз.
Поблагодарили: 45 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: Портальная пушка (Portal Gun)

Сообщение Polarhigh » 28 июл 2011, 03:29

Skillax писал(а):svida, [pawn]
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <hamsandwich>
#include <fakemeta>
#include <engine>
#include <xs>
#include <cstrike>
 [/pawn]

ну и жуть... Я такое даже и тестить не стал. все и так видно.

ээ количество модулей?
наверное они необходимы, нет?
Аватара пользователя
Polarhigh
 
Сообщения: 1006
Зарегистрирован: 04 май 2010, 17:41
Благодарил (а): 131 раз.
Поблагодарили: 388 раз.
Опыт программирования: Больше трех лет

Re: Портальная пушка (Portal Gun)

Сообщение Fedcomp » 28 июл 2011, 10:12

Ему типо не нравится что слишком много модулей. Видимо кто то не в курсе что на зомби моде с кучей аддонов сумарно столько же модулей юзается, и никто чото не выступает.
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 815 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Портальная пушка (Portal Gun)

Сообщение Skillax » 28 июл 2011, 10:29

Fedcomp писал(а):Ему типо не нравится что слишком много модулей. Видимо кто то не в курсе что на зомби моде с кучей аддонов сумарно столько же модулей юзается, и никто чото не выступает.

Я это к тому, что долго фиксить этот плагин будут.
Нда, а war3ft от части на c++ или я ошибаюсь ?
Аватара пользователя
Skillax
 
Сообщения: 273
Зарегистрирован: 29 мар 2011, 11:57
Благодарил (а): 36 раз.
Поблагодарили: 45 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: Портальная пушка (Portal Gun)

Сообщение Fedcomp » 28 июл 2011, 11:48

Даже не заглядывайся в сторону C++
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 815 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Пред.След.

Вернуться в Утвержденные плагины

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2