请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

ESFKAMI

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

ESFX

ESF: Xenoverse

ESF123

ESF1.2.3

EVM2.1

EVM2.1

ECXSSJ

ECX: TeamSSJ

ECX2.2

ECX RC2

ECX2.3

ECX RC3

查看: 1344|回复: 0

[Sample]添加技能|Add an Attack/Weapon

[复制链接]

211

主题

216

帖子

1142

积分

ESFKAMI

Rank: 8Rank: 8

积分
1142
发表于 2017-7-28 19:52:44 | 显示全部楼层 |阅读模式
by Starman

  1. /*==================================================================================================
  2. LIBRARIES.

  3. I'm using the AMX Mod X 1.8.2 and the AMX Mod X Studio 1.4.3.

  4. NOTE: For some reason, the plugin fails when using a native of the library "<esf>" refrain to
  5. use it is made.
  6. ==================================================================================================*/

  7. #include <amxmodx>
  8. #include <engine>
  9. #include <fun>
  10. #include <fakemeta>
  11. #include <hamsandwich>

  12. /*==================================================================================================
  13. BOOLEANS, RESOURCES AND OTHER VARIABLES.
  14. ==================================================================================================*/

  15. static const Resources[][] =
  16. {
  17.         "weapons/teleport.wav",
  18.         "evolution/teleport.1.wav",
  19.         "evolution/teleport.2.wav",
  20.         "evolution/teleport.3.wav"
  21. }

  22. static Sprite;

  23. // __correctCharacter : To determine if the correct character.
  24. // __correctWeapon : To determine if the correct weapon.
  25. // __correctConditions : To determine whether the charge of the weapon is between 30% and 100%.

  26. static bool:__correctCharacter[33], bool:__correctWeapon[33], bool:__correctConditions[33];

  27. /*==================================================================================================
  28. BEGINNING OF THE PLUGIN.
  29. ==================================================================================================*/

  30. public plugin_init()
  31. {
  32.         // Hamsandwich : (Ham_Item_AddToPlayer)
  33.         // We will take the exact time when a player receives the weapon, in this case, the weapon
  34.         // would be "weapon_flamethrower".
  35.         
  36.         RegisterHam(Ham_Item_AddToPlayer, "weapon_flamethrower", "@ChangeSpecialIcon");
  37.         
  38.         // Hamsandwich : (Ham_Item_ItemSlot)
  39.         // We will take the position in which the gun is located.
  40.         
  41.         RegisterHam(Ham_Item_ItemSlot, "weapon_flamethrower", "@ChangeSpecialSlot");
  42.         
  43.         // Fakemeta : (FM_AddToFullPack)
  44.         // If you wish to place an animation you must use this feature.
  45.         
  46.         register_forward(FM_AddToFullPack, "@ChangeSpecialAnimation", ._post = true);
  47.         
  48.         // AMX Mod X : (register_message)
  49.         // We will take the time it starts charging a weapon.
  50.         
  51.         register_message(get_user_msgid("Charge"), "@MessageCharge");
  52.         
  53.         // AMX Mod X : (register_event)
  54.         // We will take the time that the player is revived.
  55.         
  56.         register_event("ResetHUD", "@EventResetHUD", "b");
  57.         
  58.         // AMX Mod X : (register_event)
  59.         // We take the time when the player receives the weapons.
  60.         
  61.         register_event("WeapUpdate", "@EventWeaponUpdate", "b");
  62.         
  63.         // AMX Mod X : (register_event)
  64.         // We will take the time that the player change weapons.
  65.         
  66.         register_event("CurWeapon", "@EventCurrentWeapon", "be", "1=1");
  67.         
  68.         // AMX Mod X : (register_clcmd)
  69.         // We turned the gun "weapon_flamethrower" on the gun "special_instatrans".
  70.         // NOTE: You can change "special_instatrans" for what you want.
  71.         
  72.         register_clcmd("special_instatrans", "@ClientCommandSpecial");
  73. }

  74. public plugin_precache()
  75. {
  76.         for(new All = 0; All < sizeof Resources; All++)
  77.         {
  78.                 precache_sound(Resources[All]);
  79.         }
  80.         
  81.         Sprite = precache_model("sprites/meleeflash1.spr");
  82. }

  83. public client_connect(Client)
  84. {
  85.         // To prevent errors.
  86.         
  87.         __correctCharacter[Client] = false;
  88.         __correctWeapon[Client] = false;
  89.         __correctConditions[Client] = false;
  90. }

  91. public client_disconnect(Client)
  92. {
  93.         // To prevent errors.
  94.         
  95.         __correctCharacter[Client] = false;
  96.         __correctWeapon[Client] = false;
  97.         __correctConditions[Client] = false;
  98. }

  99. public client_PreThink(Client)
  100. {
  101.         // Take the exact moment when the player stops charging the attack.
  102.         
  103.         new Control = get_user_button(Client);
  104.         new OldControl = get_user_oldbutton(Client);
  105.         
  106.         if((!(Control & IN_ATTACK)  && (OldControl & IN_ATTACK || OldControl & IN_ATTACK2)) && !(Control & IN_ATTACK2))
  107.         {
  108.                 // If it's the right weapon and the load is between 30% and 100%...
  109.                
  110.                 if(__correctWeapon[Client] && __correctConditions[Client])
  111.                 {
  112.                         // You can delete all that is within this function and write whatever you want.
  113.                         
  114.                         emit_sound(Client, CHAN_ITEM, Resources[random_num(0, sizeof Resources - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM);
  115.                         
  116.                         new __vector_oldLocation[3], __vector_newLocation[3];
  117.                         
  118.                         get_user_origin(Client, __vector_oldLocation);
  119.                         get_user_origin(Client, __vector_newLocation, .mode = 3);
  120.                         
  121.                         __vector_newLocation[0] += ((__vector_newLocation[0] - __vector_oldLocation[0] > 0) ? -50 : 50);
  122.                         __vector_newLocation[1] += ((__vector_newLocation[1] - __vector_oldLocation[1] > 0) ? -50 : 50);
  123.                         __vector_newLocation[2] += ((__vector_newLocation[2] - __vector_oldLocation[2] > 0) ? -50 : 50);
  124.                         
  125.                         set_user_origin(Client, __vector_newLocation);
  126.                         
  127.                         message_begin(MSG_ONE, get_user_msgid("ScreenFade"), _, .player = Client);
  128.                         {
  129.                                 write_short(1<<10);
  130.                                 write_short(1<<10);
  131.                                 write_short(0x0000);
  132.                                 write_byte(255);
  133.                                 write_byte(255);
  134.                                 write_byte(255);
  135.                                 write_byte(255);
  136.                         }
  137.                         message_end();
  138.                         
  139.                         message_begin(MSG_PVS, SVC_TEMPENTITY, __vector_newLocation, .player = Client);
  140.                         {
  141.                                 write_byte(TE_SPRITE);
  142.                                 write_coord(__vector_newLocation[0]);
  143.                                 write_coord(__vector_newLocation[1]);
  144.                                 write_coord(__vector_newLocation[2]);
  145.                                 write_short(Sprite);
  146.                                 write_byte(6);
  147.                                 write_byte(200);
  148.                         }
  149.                         message_end();
  150.                 }
  151.         }
  152. }

  153. public @ChangeSpecialIcon(Weapon, Client)
  154. {
  155.         // If the user is alive and is using the correct character.
  156.         
  157.         if(is_user_alive(Client) && __correctCharacter[Client])
  158.         {
  159.                 // Message : (WeaponList)
  160.                 // It consists of 5 parameters.
  161.                
  162.                 message_begin(MSG_ONE, get_user_msgid("WeaponList"), _, .player = Client);
  163.                 {
  164.                         // write_string("special_instatrans");
  165.                         // The name of the icon file format (.txt) with which you will replace the weapon icon.
  166.                         write_string("special_instatrans");
  167.                         
  168.                         // write_byte(8);
  169.                         // The position where the weapon is.
  170.                         // NOTE: The original position of the gun "weapon_flamethrower" is 5.
  171.                         // The value you put here is equivalent to the position of the weapon - 1.
  172.                         // In the game, sensu beans are at number 9, that means that here would be 8.
  173.                         // If you change the "slot" of the gun, you must subtract 1.
  174.                         
  175.                         write_byte(8);
  176.                         
  177.                         // write_byte(2);
  178.                         // It represents the place where it is after a certain weapon.
  179.                         // First place (1) it belongs to the "weapon_sensu", second (2) belongs to the "weapon_flamethrower".
  180.                         
  181.                         write_byte(2);
  182.                         
  183.                         // write_byte(34);
  184.                         // The index of the weapon.
  185.                         // The index of the "weapon_flamethrower" is 34.
  186.                         
  187.                         write_byte(34);
  188.                         
  189.                         // The type of ammunition used by the weapon.
  190.                         // No weapon in the Earth's Special Forces used ammunition, so i placed a (0).
  191.                         
  192.                         write_byte(0);
  193.                 }
  194.                 message_end();
  195.         }
  196. }

  197. public @ChangeSpecialSlot(Item)
  198. {
  199.         // The "slot" of the gun "weapon_flamethrower" is 5.
  200.         // With this it is changed to the position number (9), together with the "weapon_sensu".
  201.         // If you change the number here, you must also change it in the message (WeaponList) by subtracting one.
  202.         // Example: 9 - 1 = 8;
  203.         
  204.         SetHamReturnInteger(9);
  205.         
  206.         return HAM_SUPERCEDE;
  207. }

  208. public @ChangeSpecialAnimation(Handle, Edict, Entity, Host, Flags, Player, Set)
  209. {
  210.         
  211.         // If the constant "player" and "entity" belong to a player, and that player is alive and use the right weapon.
  212.         
  213.         if(Player && Entity == Host && is_user_alive(Host) && __correctWeapon[Entity])
  214.         {
  215.                 // You have some knowledge when playing animations player.
  216.                
  217.                 new Animation = get_es(Handle, ES_Sequence);
  218.                
  219.                 if((Animation >= 0 && Animation <= 11 || Animation >= 28 && Animation <= 35) && Animation != 218)
  220.                 {
  221.                         // Default animation for this weapon.
  222.                         
  223.                         set_es(Handle, ES_Sequence, 218);
  224.                         
  225.                         // Miscellaneuos.
  226.                         
  227.                         set_es(Handle, ES_Frame, 235.5);
  228.                         set_es(Handle, ES_FrameRate, 0.0);
  229.                 }
  230.         }
  231. }

  232. public @EventResetHUD(Client)
  233. {
  234.         // If the player is alive.
  235.         
  236.         if(is_user_alive(Client))
  237.         {
  238.                 // If the player is using the correct character.
  239.                 // (2) Represents the index of the character, in this case, is Goku.
  240.                
  241.                 __correctCharacter[Client] = (entity_get_int(Client, EV_INT_playerclass) == 2 ? true : false);
  242.         }
  243. }

  244. public @EventWeaponUpdate(Client)
  245. {
  246.         // If correct character.
  247.         
  248.         if(__correctCharacter[Client])
  249.         {
  250.                 // We give him weapon "weapon flamethrower".
  251.                
  252.                 set_task(0.0, "@AddToPlayerSpecial", Client);
  253.         }
  254. }

  255. public @EventCurrentWeapon(Client)
  256. {
  257.         // If the player is alive and is correct character.
  258.         
  259.         if(is_user_alive(Client) && __correctCharacter[Client])
  260.         {
  261.                 // If the index of the gun is correct.
  262.                 // In this case, the index of the "weapon_flamethrower" is the number (34).
  263.                
  264.                 __correctWeapon[Client] = (read_data(2) == 34 ? true : false);
  265.         }
  266. }

  267. public @MessageCharge(Message, Dest, Client)
  268. {
  269.         // If the percentage of the load is between 30% and 100% ...
  270.         // it is the correct weapon and has not yet released the attack.
  271.         
  272.         if((get_msg_arg_int(1) >= 30 && get_msg_arg_int(1) <= 100) && get_msg_arg_int(1) != 0 && __correctWeapon[Client])
  273.         {
  274.                 // Will increase the speed with which loads the attack.
  275.                
  276.                 set_msg_arg_int(1, ARG_BYTE, get_msg_arg_int(1) + 20);
  277.                
  278.                 // If the percentage is greater than 100%.
  279.                
  280.                 if(get_msg_arg_int(1) > 100)
  281.                 {
  282.                         // We put 100%.
  283.                         
  284.                         set_msg_arg_int(1, ARG_BYTE, 100);
  285.                 }
  286.         }
  287.         
  288.         // If the percentage is between 30% and 100%.
  289.         
  290.         __correctConditions[Client] = (get_msg_arg_int(1) >= 30 && get_msg_arg_int(1) <= 100 ? true : false);
  291. }

  292. public @ClientCommandSpecial(Client)
  293. {
  294.         // When the user to change/choose weapon "flamethrower_weapon", the we will become the special weapon.
  295.         
  296.         message_begin(MSG_ONE, get_user_msgid("CurWeapon"), _, .player = Client);
  297.         {
  298.                 write_byte(1);
  299.                 write_byte(34);
  300.                 write_byte(-1);
  301.         }
  302.         message_end();
  303.         
  304.         engclient_cmd(Client, "weapon_flamethrower");
  305.         
  306.         return PLUGIN_HANDLED;
  307. }

  308. public @AddToPlayerSpecial(Client)
  309. {
  310.         // We give the weapon to the player.
  311.                
  312.         give_item(Client, "weapon_flamethrower");
  313. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|ESFKAMI    

GMT+8, 2018-5-24 02:37 , Processed in 0.302319 second(s), 21 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表