Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
// Projet: MQ2Melee.cpp |
// Author: s0rCieR |
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
// SHOW_ABILITY: 0=0ff, 1=Display every ability that plugin use.
// SHOW_ATTACKING: 0=0ff, 1=Display Attacking Target
// SHOW_ENRAGING: 0=0ff, 1=Display Enrage/Infuriate
// SHOW_FEIGN: 0=0ff, 1=Display Fallen Detected
// SHOW_OVERRIDE: 0=0ff, 1=Display Override Warning
// SHOW_STICKING: 0=0ff, 1=Display Stick Arguments
// SHOW_SWITCHING: 0=0ff, 1=Display Switch Melee/Range
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
// Distribution of this code in compile form without source code is prohebited.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
#define PLUGIN_NAME "MQ2Melee" // Plugin Name
#define PLUGIN_DATE 20071202 // Plugin Date
#define PLUGIN_VERS 4.808 // Plugin Version
#define SHOW_ABILITY 0
#define SHOW_ATTACKING 1
#define SHOW_CASTING 0
#define SHOW_CONTROL 0
#define SHOW_ENRAGING 1
#define SHOW_FEIGN 1
#define SHOW_OVERRIDE 1
#define SHOW_PROVOKING 0
#define SHOW_STICKING 1
#define SHOW_STUNNING 0
#define SHOW_SWITCHING 1
#define NOID -1
#define delay 250
enum {
Nokey =0, // WinClick(KeyState) nokey pressed
Shiftkey =1, // WinClick(KeyState) Shiftkey pressed
Ctrlkey =256, // WinClick(KeyState) Ctrlkey pressed
};
enum {
Tiny =0, // Container Size - Tiny
Small =1, // Container Size - Small
Medium =2, // Container Size - Medium
Large =3, // Container Size - Large
Giant =4, // Container Size - Giant
Huge =5, // Container Size - Huge
};
enum {
st_x =0x0000, // SpawnType: NONE
st_cn =0x0020, // SpawnType: CORPSENPC
st_cp =0x0010, // SpawnType: CORPSEPLAYER
st_wn =0x0008, // SpawnType: PETNPC
st_wp =0x0004, // SpawnType: PETPLAYER
st_n =0x0002, // SpawnType: NPC
st_p =0x0001, // SpawnType: PLAYER
};
enum {
inv_range =11, // Inventory.Range Slot ID
inv_primary =13, // Inventory.Primary Slot ID
inv_secondary =14, // Inventory.Secondary Slot ID
inv_ammo =22, // Inventory.Ammo Slot ID
};
#ifndef PLUGIN_API
#include "../MQ2Plugin.h"
PreSetup(PLUGIN_NAME);
PLUGIN_VERSION(PLUGIN_VERS);
#include <map>
#include <string>
#include "../Blech/Blech.h"
#endif PLUGIN_API
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
bool DebugReady =false; // Use for debuffing Ability->Ready();
bool BardClass =false; // Bard Class?
bool Silenced =false; // Silenced?
long BuffMax =25; // Maximum Number of Buffs
long SongMax =12; // Maximum Number of Songs
long GemsMax =10; // Maximum Number of Gems
long InvSlot =NOID; // slot # where item is found
PCONTENTS InvCont =NULL; // slot content pointer
long Sticking =false; // Stick Saved State On/Off?
char StickArg[128] ={0}; // Stick Saved Arguments
char Reserved[MAX_STRING]; // string buffer
char Workings[MAX_STRING]; // string buffer
typedef VOID (__cdecl *Function)(VOID);
struct infodata {long i,t; } *pinfodata;
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
#define d_assassin1 10898
#define d_assassin2 10899
#define d_assassin3 10900
#define d_ashenhand 4508
#define d_heelofkanji 8473
#define d_silentfist 4507
#define d_thunderkick 4511
#define d_cleaveanger 5043
#define d_cleaverage 5037
#define i_disarm 16
#define i_forage 27
#define i_harmtouch 105
#define i_intimidation 71
#define i_kick 30
#define i_mend 32
#define i_taunt 73
infodata callchal={552 ,4}, // aa: call of challenge
cmmding ={8000 ,3}, // disc: commanding voice
cryhavoc={8003 ,3}, // disc: cry havoc
escape ={102 ,4}, // aa: escape
fistswu ={8002 ,3}, // disc: fists of wu
feignid ={420 ,4}, // aa: imitate death
feigndp ={428 ,4}, // aa: death peace
feignsa ={366 ,5}, // spell: feign death
feignsb ={3685 ,5}, // spell: comatose
feignsc ={1460 ,5}, // spell: death peace
feignsd ={10306 ,5}, // spell: last breath
feignse ={10307 ,5}, // spell: last breath rk ii
feignsf ={10308 ,5}, // spell: last breath rk iii
feignsg ={15223 ,5}, // spell: rigor mortis
feignsh ={15224 ,5}, // spell: rigor mortis rk ii
feignsi ={15225 ,5}, // spell: rigor mortis rk iii
feignsj ={15190 ,5}, // spell: last gasp
feignsk ={15191 ,5}, // spell: last gasp rk ii
feignsl ={15192 ,5}, // spell: last gasp rk iii
feral1 ={247 ,4}, // aa: feral swipe
honora ={10173 ,5}, // spell: challenge for honor
honorb ={10174 ,5}, // spell: challenge for honor rk ii
honorc ={10175 ,5}, // spell: challenge for honor rk iii
honord ={14954 ,5}, // spell: trial for honor
honore ={14955 ,5}, // spell: trial for honor rk ii
honorf ={14956 ,5}, // spell: trial for honor rk iii
joltbera={4934 ,3}, // disc: diversive strike
joltberb={4935 ,3}, // disc: distracting strike
joltberc={4936 ,3}, // disc: confusing strike
joltberd={6171 ,3}, // disc: baffling strike
joltbere={10920 ,3}, // disc: jarring strike
joltberf={10921 ,3}, // disc: jarring strike rk ii
joltberg={10922 ,3}, // disc: jarring strike rk iii
joltberh={14186 ,3}, // disc: jarring smash
joltberi={10187 ,3}, // disc: jarring smash rk ii
joltberj={10188 ,3}, // disc: jarring smash rk iii
joltbst1={362 ,4}, // aa: roar of thunder
joltrng1={1741 ,5}, // spell: jolt
joltrng2={1296 ,5}, // spell: cinder jolt
joltrng3={10086 ,3}, // disc: jolting kicks
joltrng4={10087 ,3}, // disc: jolting kicks rk ii
joltrng5={10088 ,3}, // disc: jolting kicks rk iii
layhand ={6001 ,4}, // aa: lay on hands
leop1 ={6752 ,3}, // disc: leopard claw
leop2 ={6727 ,3}, // disc: dragon fang
leop3 ={10944 ,3}, // disc: clawstriker flurry
leop4 ={10945 ,3}, // disc: clawstriker flurry rk ii
leop5 ={10946 ,3}, // disc: clawstriker flurry rk iii
leop6 ={14796 ,3}, // disc: wheel of fists
leop7 ={14797 ,3}, // disc: wheel of fists rk ii
leop8 ={14798 ,3}, // disc: wheel of fists rk iii
mendpet1={58 ,4}, // aa: mend companion
mendpet2={418 ,4}, // aa: replenish companion
potfast0={77789 ,7}, // potion: Distillate of Divine Healing I
potfast1={77790 ,7}, // potion: Distillate of Divine Healing II
potfast2={77791 ,7}, // potion: Distillate of Divine Healing III
potfast3={77792 ,7}, // potion: Distillate of Divine Healing IV
potfast4={77793 ,7}, // potion: Distillate of Divine Healing V
potfast5={77794 ,7}, // potion: Distillate of Divine Healing VI
potfast6={77795 ,7}, // potion: Distillate of Divine Healing VII
potfast7={77796 ,7}, // potion: Distillate of Divine Healing VIII
potfast8={77797 ,7}, // potion: Distillate of Divine Healing IX
potfast9={77798 ,7}, // potion: Distillate of Divine Healing X
potover0={77779 ,7}, // potion: Distillate of Celestial Healing I
potover1={77780 ,7}, // potion: Distillate of Celestial Healing II
potover2={77781 ,7}, // potion: Distillate of Celestial Healing III
potover3={77782 ,7}, // potion: Distillate of Celestial Healing IV
potover4={77783 ,7}, // potion: Distillate of Celestial Healing V
potover5={77784 ,7}, // potion: Distillate of Celestial Healing VI
potover6={77785 ,7}, // potion: Distillate of Celestial Healing VII
potover7={77786 ,7}, // potion: Distillate of Celestial Healing VIII
potover8={77787 ,7}, // potion: Distillate of Celestial Healing IX
potover9={77788 ,7}, // potion: Distillate of Celestial Healing X
powera ={10260 ,5}, // spell: challenge for power
powerb ={10261 ,5}, // spell: challenge for power rk ii
powerc ={10262 ,5}, // spell: challenge for power rk iii
powerd ={15163 ,5}, // spell: trial for power
powere ={15164 ,5}, // spell: trial for power rk ii
powerf ={15165 ,5}, // spell: trial for power rk iii
prowar_a={4608 ,3}, // disc: provoke
prowar_b={4681 ,3}, // disc: bellow
prowar_c={4682 ,3}, // disc: berate
prowar_d={4697 ,3}, // disc: incite
prowar_e={5015 ,3}, // disc: bellow of the mastruq
prowar_f={5016 ,3}, // disc: ancient: chaos cry
prowar_g={6173 ,3}, // disc: bazu bellow
prowar_h={10974 ,3}, // disc: scowl
prowar_i={10975 ,3}, // disc: scowl rk ii
prowar_j={10976 ,3}, // disc: scowl rk iii
prowar_k={15360 ,3}, // disc: sneer
prowar_l={15361 ,3}, // disc: sneer rk ii
prowar_m={15362 ,3}, // disc: sneer rk iii
rake1 ={8782 ,3}, // disc: rake
rake2 ={14158 ,3}, // disc: harrow
rake3 ={14159 ,3}, // disc: harrow rk ii
rake4 ={14160 ,3}, // disc: harrow rk iii
strikea ={4659 ,3}, // disc: sneak attack
strikeb ={4685 ,3}, // disc: theif's vengeance
strikec ={4686 ,3}, // disc: assasin strike
striked ={5017 ,3}, // disc: kyv strike
strikee ={5018 ,3}, // disc: ancient chaos strike
strikef ={6174 ,3}, // disc: daggerfall
strikeg ={8470 ,3}, // disc: razor arc
strikeh ={15133, 3}, // disc: swiftblade
strikei ={15134, 3}, // disc: swiftblade rk ii
strikej ={15135, 3}, // disc: swiftblade rk iii
stunbera={4931 ,3}, // disc: head strike
stunberb={4932 ,3}, // disc: head pummel
stunberc={4933 ,3}, // disc: head crush
stunberd={6170 ,3}, // disc: mind strike
stunbere={10917 ,3}, // disc: temple blow
stunberf={10918 ,3}, // disc: temple blow rk ii
stunberg={10919 ,3}, // disc: temple blow rk iii
stunberh={14183 ,3}, // disc: temple strike
stunberi={14184 ,3}, // disc: temple strike rk ii
stunberj={14185 ,3}, // disc: temple strike rk iii
stunmnk1={469 ,4}, // aa: stunning kick
stunmnk2={600 ,4}, // aa: resounding kick
stunpal1={73 ,4}, // aa: divine stun
stunpal2={702 ,4}, // aa: hand of disruption
stunpal3={3826 ,4}, // aa: force of disruption
stunpala={216 ,5}, // spell: stun
stunpalb={123 ,5}, // spell: holy might
stunpalc={3975 ,5}, // spell: force of akera
stunpald={3245 ,5}, // spell: force of akilea
stunpale={4977 ,5}, // spell: ancient force of chaos
stunpalf={5284 ,5}, // spell: force of piety
stunpalg={5299 ,5}, // spell: ancient force of jeron
stunpalh={10158 ,5}, // spell: sacred force
stunpali={10159 ,5}, // spell: sacred force rk ii
stunpalj={10160 ,5}, // spell: sacred force rk iii
stunpalk={14942 ,5}, // spell: solemn force
stunpall={14942 ,5}, // spell: solemn force rk ii
stunpalm={14942 ,5}, // spell: solemn force rk iii
terrora ={1223 ,5}, // spell: terror of death
terrorb ={1224 ,5}, // spell: terror of terris
terrorc ={3405 ,5}, // spell: terror of thule
terrord ={5329 ,5}, // spell: terror of discord
terrore ={10257 ,5}, // spell: terror of vergalid
terrorf ={10258 ,5}, // spell: terror of vergalid rk ii
terrorg ={10259 ,5}, // spell: terror of vergalid rk iii
terrorh ={15160 ,5}, // spell: terror of the Soulbleeder
terrori ={15161 ,5}, // spell: terror of the Soulbleeder rk ii
terrorj ={15162 ,5}, // spell: terror of the Soulbleeder rk iii
thiefeye={8001 ,3}, // disc: thief's eye
tstone ={5225 ,3}, // disc: throw stone
twisted ={670 ,4}, // aa: twisted shank
volleya ={6754 ,3}, // disc: rage volley
volleyb ={6729 ,3}, // disc: destroyer's volley
volleyc ={10926 ,3}, // disc: giant slayer's volley
volleyd ={10927 ,3}, // disc: giant slayer's volley rk ii
volleye ={10928 ,3}, // disc: giant slayer's volley rk iii
volleyf ={11928 ,3}, // disc: annihilator's volley
volleyg ={11929 ,3}, // disc: annihilator's volley rk ii
volleyh ={11930 ,3}, // disc: annihilator's volley rk iii
volleyi ={14195 ,3}, // disc: decimator's volley
volleyj ={14196 ,3}, // disc: decimator's volley rk ii
volleyk ={14197 ,3}, // disc: decimator's volley rk iii
sbkstab ={8 ,2}, // skill: backstab
sbash ={10 ,2}, // skill: bash
sbegging={67 ,2}, // skill: begging
sdisarm ={16 ,2}, // skill: disarm
sdrpunch={21 ,2}, // skill: dragon punch
sestrike={23 ,2}, // skill: eagle strike
sfeign ={25 ,2}, // skill: feign death
sflykick={26 ,2}, // skill: flying kick
sforage ={27 ,2}, // skill: forage
sfrenzy ={74 ,2}, // skill: frenzy
sharmtou={105 ,2}, // skill: harmtouch
shide ={29 ,2}, // skill: hide
sintim ={71 ,2}, // skill: intimidation
skick ={30 ,2}, // skill: kick
smend ={32 ,2}, // skill: mend
sppocket={48 ,2}, // skill: pick pockets
srndkick={38 ,2}, // skill: round kick
ssensetr={62 ,2}, // skill: sense trap
sslam ={111 ,2}, // skill: slam
ssneak ={42 ,2}, // skill: sneak
staunt ={73 ,2}, // skill: taunt
stigclaw={52 ,2}; // skill: tigerclaw
PCHAR pAGGRO[]={
"aggro",
"[ON/OFF]?",
"${If[${Select[${Me.Class.ShortName},WAR,PAL,SHD]},1,0]}",
"${If[${meleemvi[plugin]},1,0]}",
};
PCHAR pAGGRP[]={
"aggropri",
"[ID] Primary (Aggro)?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${meleemvi[aggro]},1,0]}",
};
PCHAR pAGGRS[]={
"aggrosec",
"[ID] Offhand (Aggro)?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${meleemvi[aggro]} && ${meleemvi[aggropri]},1,0]}",
};
PCHAR pARROW[]={
"arrow",
"[ID] item?",
"0",
"${If[${meleemvi[plugin]} && (${Me.Skill[archery]} || ${Me.Skill[throwing]}),1,0]}",
};
PCHAR pASSAS[]={
"assasinate",
"Sneak/Hide/Behind/Strike/Stab [ON/OFF]?",
"${If[${Me.Skill[backstab]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${meleemvi[backstab]},1,0]}",
};
PCHAR pBKOFF[]={
"backoff",
"[#] Life% Below? 0=0ff",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && !${meleemvi[aggro]},1,0]}",
};
PCHAR pBSTAB[]={
"backstab",
"[ON/OFF]?",
"${If[${Me.Skill[backstab]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[backstab]},1,0]}",
};
PCHAR pBASHS[]={
"bash",
"[#] Bash 0=0ff",
"${If[${Me.Skill[bash]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[bash]},1,0]}",
};
PCHAR pBGING[]={
"begging",
"[ON/OFF]?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[begging]},1,0]}",
};
PCHAR pBOWID[]={
"bow",
"[ID] spell/disc/aa/item?",
"0",
"${If[${meleemvi[plugin]} && ${Me.Skill[archery]},1,0]}",
};
PCHAR pCALLC[]={
"callchallenge",
"[ON/OFF]?",
"${If[${Me.AltAbility[call of challenge]},1,0]}",
"${If[${meleemvi[plugin]} && ${Me.AltAbility[call of challenge]},1,0]}",
};
PCHAR pCHFOR[]={
"challengefor",
"[ON/OFF]?",
"${If[${Me.Book[challenge for honor]} || ${Me.Book[challenge for honor rk. ii]} || ${Me.Book[challenge for honor rk. iii]} || ${Me.Book[trial for honor]} || ${Me.Book[trial for honor rk. ii]} || ${Me.Book[trial for honor rk. iii]} || ${Me.Book[challenge for power]} || ${Me.Book[challenge for power rk. ii]} || ${Me.Book[challenge for power rk. iii]} || ${Me.Book[trial for power]} || ${Me.Book[trial for power rk. ii]} || ${Me.Book[trial for power rk. iii]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[aggro]} && (${Me.Book[challenge for honor]} || ${Me.Book[challenge for honor rk. ii]} || ${Me.Book[challenge for honor rk. iii]} || ${Me.Book[trial for honor]} || ${Me.Book[trial for honor rk. ii]} || ${Me.Book[trial for honor rk. iii]} || ${Me.Book[challenge for power]} || ${Me.Book[challenge for power rk. ii]} || ${Me.Book[challenge for power rk. iii]} || ${Me.Book[trial for power]} || ${Me.Book[trial for power rk. ii]} || ${Me.Book[trial for power rk. iii]}),1,0]}",
};
PCHAR pCOMMG[]={
"commanding",
"[#] Endu% Above? 0=0ff",
"${If[${Me.CombatAbility[commanding voice]},60,0]}",
"${If[${meleemvi[plugin]} && ${Me.CombatAbility[commanding voice]},1,0]}",
};
PCHAR pCRYHC[]={
"cryhavoc",
"[#] Endu% Above? 0=0ff",
"${If[${Me.CombatAbility[cry havoc]},60,0]}",
"${If[${meleemvi[plugin]} && ${Me.CombatAbility[cry havoc]},1,0]}",
};
PCHAR pDISRM[]={
"disarm",
"[ON/OFF]?",
"${If[${Me.Skill[disarm]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[disarm]},1,0]}",
};
PCHAR pDWNF0[]={
"downflag0",
"[ON/OFF] downflag0?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[downshit0].Length},1,0]}",
};
PCHAR pDWNF1[]={
"downflag1",
"[ON/OFF] downflag1?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[downshit1].Length},1,0]}",
};
PCHAR pDWNF2[]={
"downflag2",
"[ON/OFF] downflag2?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[downshit2].Length},1,0]}",
};
PCHAR pDWNF3[]={
"downflag3",
"[ON/OFF] downflag3?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[downshit3].Length},1,0]}",
};
PCHAR pDWNF4[]={
"downflag4",
"[ON/OFF] downflag4?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[downshit4].Length},1,0]}",
};
PCHAR pDWNF5[]={
"downflag5",
"[ON/OFF] downflag5?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[downshit5].Length},1,0]}",
};
PCHAR pDWNF6[]={
"downflag6",
"[ON/OFF] downflag6?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[downshit6].Length},1,0]}",
};
PCHAR pDWNF7[]={
"downflag7",
"[ON/OFF] downflag7?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[downshit7].Length},1,0]}",
};
PCHAR pDRPNC[]={
"dragonpunch",
"[ON/OFF]?",
"${If[${Me.Skill[dragon punch]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[dragon punch]},1,0]}",
};
PCHAR pEAGLE[]={
"eaglestrike",
"[ON/OFF]?",
"${If[${Me.Skill[eagle strike]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[eagle strike]},1,0]}",
};
PCHAR pERAGE[]={
"enrage",
"[ON/OFF]?",
"1",
"${If[${meleemvi[plugin]},1,0]}",
};
PCHAR pESCAP[]={
"escape",
"[#] Life% Below? 0=0ff",
"${If[${Me.AltAbility[escape]},20,0]}",
"${If[${meleemvi[plugin]} && !${meleemvi[aggro]} && ${Me.AltAbility[escape]},1,0]}",
};
PCHAR pEVADE[]={
"evade",
"[#] [ON/OFF]?",
"${If[${Me.Skill[hide]} && ${Me.Class.ShortName.Equal[ROG]},1,0]}",
"${If[${meleemvi[plugin]} && !${meleemvi[aggro]} && ${Me.Skill[hide]} && ${Me.Class.ShortName.Equal[ROG]},1,0]}",
};
PCHAR pFEIGN[]={
"feigndeath",
"[#] Life% Below? 0=0ff",
"${If[${Select[${Me.Class.ShortName},SHD,NEC,MNK]},30,0]}",
"${If[${meleemvi[plugin]} && !${meleemvi[aggro]} && ${Select[${Me.Class.ShortName},SHD,NEC,MNK]},1,0]}",
};
PCHAR pFACES[]={
"facing",
"[ON/OFF] Face Target (Range)?",
"1",
"${If[${meleemvi[plugin]} && ${meleemvi[range]},1,0]}",
};
PCHAR pFALLS[]={
"falls",
"[ON/OFF] Auto-Feign?",
"0",
"${If[${meleemvi[plugin]} && !${meleemvi[aggro]} && ${Me.Class.ShortName.Equal[MNK]},1,0]}",
};
PCHAR pFERAL[]={
"feralswipe",
"[ON/OFF]?",
"${If[${Me.AltAbility[feral swipe]},1,0]}",
"${If[${meleemvi[plugin]} && ${Me.AltAbility[feral swipe]},1,0]}",
};
PCHAR pFISTS[]={
"fistsofwu",
"[#] Endu% Above? 0=0ff",
"${If[${Me.CombatAbility[fists of wu]},60,0]}",
"${If[${meleemvi[plugin]} && ${Me.CombatAbility[fists of wu]},1,0]}",
};
PCHAR pFLYKC[]={
"flyingkick",
"[ON/OFF]?",
"${If[${Me.Skill[flying kick]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[flying kick]},1,0]}",
};
PCHAR pFORAG[]={
"forage",
"[ON/OFF]?",
"0",
"${If[${meleemvi[plugin]} && ${Me.Skill[forage]},1,0]}",
};
PCHAR pFRENZ[]={
"frenzy",
"[ON/OFF]?",
"${If[${Me.Skill[frenzy]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[frenzy]} && ${Me.Skill[frenzy]},1,0]}",
};
PCHAR pHARMT[]={
"harmtouch",
"[ON/OFF]?",
"${If[${Me.Skill[harm touch]}!=255,1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[harm touch]}!=255,1,0]}",
};
PCHAR pHIDES[]={
"hide",
"[ON/OFF]?",
"0",
"${If[${meleemvi[plugin]} && ${Me.Skill[hide]},1,0]}",
};
PCHAR pHOLF0[]={
"holyflag0",
"[ON/OFF] holyflag0?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[holyshit0].Length},1,0]}",
};
PCHAR pHOLF1[]={
"holyflag1",
"[ON/OFF] holyflag1?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[holyshit1].Length},1,0]}",
};
PCHAR pHOLF2[]={
"holyflag2",
"[ON/OFF] holyflag2?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[holyshit2].Length},1,0]}",
};
PCHAR pHOLF3[]={
"holyflag3",
"[ON/OFF] holyflag3?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[holyshit3].Length},1,0]}",
};
PCHAR pHOLF4[]={
"holyflag4",
"[ON/OFF] holyflag4?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[holyshit4].Length},1,0]}",
};
PCHAR pHOLF5[]={
"holyflag5",
"[ON/OFF] holyflag5?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[holyshit5].Length},1,0]}",
};
PCHAR pHOLF6[]={
"holyflag6",
"[ON/OFF] holyflag6?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[holyshit6].Length},1,0]}",
};
PCHAR pHOLF7[]={
"holyflag7",
"[ON/OFF] holyflag7?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvs[holyshit7].Length},1,0]}",
};
PCHAR pINFUR[]={
"infuriate",
"[ON/OFF]?",
"1",
"${If[${meleemvi[plugin]},1,0]}",
};
PCHAR pINTIM[]={
"intimidation",
"[ON/OFF]?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[intimidation]},1,0]}",
};
PCHAR pJOLTS[]={
"jolt",
"Every [#] of Hits,0=0ff",
"0",
"${If[${meleemvi[plugin]} && !${meleemvi[aggro]} && ${Select[${Me.Class.ShortName},BER,BST,RNG]},1,0]}",
};
PCHAR pKICKS[]={
"kick",
"[ON/OFF]?",
"${If[${Me.Skill[kick]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[kick]},1,0]}",
};
PCHAR pLHAND[]={
"layhand",
"[#] MyLife% Below? 0=0ff",
"${If[${Me.AltAbility[Lay on Hands]},1,0]}",
"${If[${meleemvi[plugin]} && ${Me.AltAbility[Lay on Hands]},1,0]}",
};
PCHAR pLCLAW[]={
"leopardclaw",
"[#] Endu% Above? 0=0ff",
"${If[${Me.CombatAbility[leopard claw]} || ${Me.CombatAbility[dragon fang]} || ${Me.CombatAbility[clawstriker's flurry]} || ${Me.CombatAbility[clawstriker's flurry rk. ii]} || ${Me.CombatAbility[clawstriker's flurry rk. iii]} || ${Me.CombatAbility[wheel of fists]} || ${Me.CombatAbility[wheel of fists rk. ii]} || ${Me.CombatAbility[wheel of fists rk. iii]},60,0]}",
"${If[${meleemvi[plugin]} && (${Me.CombatAbility[leopard claw]} || ${Me.CombatAbility[dragon fang]} || ${Me.CombatAbility[clawstriker's flurry]} || ${Me.CombatAbility[clawstriker's flurry rk. ii]} || ${Me.CombatAbility[clawstriker's flurry rk. iii]} || ${Me.CombatAbility[wheel of fists]} || ${Me.CombatAbility[wheel of fists rk. ii]} || ${Me.CombatAbility[wheel of fists rk. iii]}),1,0]}",
};
PCHAR pMELEE[]={
"melee",
"[ON/OFF] Melee Mode? 0=0ff",
"${If[${Select[${Me.Class.ShortName},WAR,PAL,RNG,SHD,MNK,BRD,ROG,BST,BER]},1,0]}",
"${If[${meleemvi[plugin]},1,0]}",
};
PCHAR pMELEP[]={
"meleepri",
"[ID] Primary (Melee)?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && !${meleemvi[aggro]},1,0]}",
};
PCHAR pMELES[]={
"meleesec",
"[ID] Offhand (Melee)?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && !${meleemvi[aggro]},1,0]} && ${meleemvi[meleepri]}",
};
PCHAR pMENDS[]={
"mend",
"[#] MyLife% Below? 0=0ff",
"${If[${Me.Skill[mend]},1,0]}",
"${If[${meleemvi[plugin]} && ${Me.Skill[mend]},1,0]}",
};
PCHAR pPETAS[]={
"petassist",
"[ON/OFF] Assist Me?",
"${If[${Select[${Me.Class.ShortName},SHD,DRU,SHM,NEC,MAG,ENC,BST]},1,0]}",
"${If[${meleemvi[plugin]} && ${Select[${Me.Class.ShortName},SHD,DRU,SHM,NEC,MAG,ENC,BST]},1,0]}",
};
PCHAR pPETDE[]={
"petdelay",
"[#] # Sec Delay Before Engaging?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[petassist]} && ${Select[${Me.Class.ShortName},SHD,DRU,SHM,NEC,MAG,ENC,BST]},1,0]}",
};
PCHAR pPETRN[]={
"petrange",
"[#] Target/Pet in this range?",
"75",
"${If[${meleemvi[plugin]} && ${meleemvi[petassist]} && ${Select[${Me.Class.ShortName},SHD,DRU,SHM,NEC,MAG,ENC,BST]},1,0]}",
};
PCHAR pPETMN[]={
"petmend",
"[#] Mend Pet Life % Below 0=0ff?",
"20",
"${If[${meleemvi[plugin]} && ${meleemvi[petassist]} && ${Me.AltAbility[mend companion]} && ${Select[${Me.Class.ShortName},SHD,DRU,SHM,NEC,MAG,ENC,BST]},1,0]}",
};
PCHAR pPICKP[]={
"pickpocket",
"[ON/OFF]?",
"${If[${Me.Skill[pick pockets]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[pick pockets]},1,0]}",
};
PCHAR pPLUGS[]={
"plugin",
"[ON/OFF]?",
"1",
"1",
};
PCHAR pPOKER[]={
"poker",
"[ID] item?",
"0",
"${If[${meleemvi[plugin]} && ${Me.Skill[backstab]},1,0]}",
};
PCHAR pHFAST[]={
"pothealfast",
"[#] MyLife% Below? 0=0ff (FAST)",
"${If[${meleemvi[idpothealfast]},30,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[idpothealfast]},1,0]}",
};
PCHAR pHOVER[]={
"pothealover",
"[#] MyLife% Below? 0=0ff (OVER)",
"${If[${meleemvi[idpothealover]},60,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[idpothealover]},1,0]}",
};
PCHAR pPRVKO[]={
"provokeonce",
"[ON/OFF]?",
"${If[${Select[${Me.Class.ShortName},WAR,PAL,SHD,MNK,BER]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[aggro]} && ${Select[${Me.Class.ShortName},WAR,PAL,SHD,MNK,BER]},1,0]}",
};
PCHAR pPRVKM[]={
"provokemax",
"[#] Counter? ,1=try once, 0=0ff",
"${If[${Select[${Me.Class.ShortName},WAR,PAL,SHD,MNK,BER]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[aggro]} && ${Select[${Me.Class.ShortName},WAR,PAL,SHD,MNK,BER]},1,0]}",
};
PCHAR pPRVKE[]={
"provokeend",
"[#] Stop when Target Life% Below?",
"${If[${Select[${Me.Class.ShortName},WAR,PAL,SHD,MNK,BER]},20,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[aggro]} && ${meleemvi[provokemax]} && ${Select[${Me.Class.ShortName},WAR,PAL,SHD,MNK,BER]},1,0]}",
};
PCHAR pPRVK0[]={
"provoke0",
"[ID] spell/disc/aa/item?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[aggro]} && ${meleemvi[provokemax]} && ${Select[${Me.Class.ShortName},WAR,PAL,SHD,MNK,BER]},1,0]}",
};
PCHAR pPRVK1[]={
"provoke1",
"[ID] spell/disc/aa/item?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[aggro]} && ${meleemvi[provokemax]} && ${Select[${Me.Class.ShortName},WAR,PAL,SHD,MNK,BER]},1,0]}",
};
PCHAR pRAVOL[]={
"ragevolley",
"[#] Endu% Above? 0=0ff",
"${If[${Me.CombatAbility[rage volley]} || ${Me.CombatAbility[destroyer's volley]} || ${Me.CombatAbility[giantslayer's volley]} || ${Me.CombatAbility[giantslayer's volley rk. ii]} || ${Me.CombatAbility[giantslayer's volley rk. iii]} || ${Me.CombatAbility[annihilator's volley]} || ${Me.CombatAbility[annihilator's volley rk. ii]} || ${Me.CombatAbility[annihilator's volley rk. iii]} || ${Me.CombatAbility[decimator's volley]} || ${Me.CombatAbility[decimator's volley rk. ii]} || ${Me.CombatAbility[decimator's volley rk. iii]},60,0]}",
"${If[${meleemvi[plugin]} && (${Me.CombatAbility[rage volley]} || ${Me.CombatAbility[destroyer's volley]} || ${Me.CombatAbility[giantslayer's volley]} || ${Me.CombatAbility[giantslayer's volley rk. ii]} || ${Me.CombatAbility[giantslayer's volley rk. iii]} || ${Me.CombatAbility[annihilator's volley]} || ${Me.CombatAbility[annihilator's volley rk. ii]} || ${Me.CombatAbility[annihilator's volley rk. iii]} || ${Me.CombatAbility[decimator's volley]} || ${Me.CombatAbility[decimator's volley rk. ii]} || ${Me.CombatAbility[decimator's volley rk. iii]}),1,0]}",
};
PCHAR pRAKES[]={
"rake",
"[#] Endu% Above? 0=Off",
"${If[${Me.CombatAbility[rake]} || ${Me.CombatAbility[harrow]} || ${Me.CombatAbility[harrow rk. ii]} ${Me.CombatAbility[harrow rk. iii]},60,0]}",
"${If[${meleemvi[plugin]} && (${Me.CombatAbility[rake]} || ${Me.CombatAbility[harrow]} || ${Me.CombatAbility[harrow rk. ii]} ${Me.CombatAbility[harrow rk. iii]}),1,0]}",
};
PCHAR pRANGE[]={
"range",
"[#] Max Range? 0=0ff",
"0",
"${If[${meleemvi[plugin]},1,0]}",
};
PCHAR pRESUM[]={
"resume",
"[#] Life% Above? 100=0ff",
"20",
"${If[${meleemvi[plugin]} && !${meleemvi[aggro]},1,0]}",
};
PCHAR pRKICK[]={
"roundkick",
"[ON/OFF]?",
"${If[${Me.Skill[round kick]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[round kick]},1,0]}",
};
PCHAR pSENSE[]={
"sensetraps",
"[ON/OFF]?",
"0",
"${If[${meleemvi[plugin]} && ${Me.Skill[sensetraps]},1,0]}",
};
PCHAR pSHIEL[]={
"shield",
"[ID] item?",
"0",
"${If[${meleemvi[plugin]} && ${Me.Skill[bash]},1,0]}",
};
PCHAR pSLAMS[]={
"slam",
"[ON/OFF]?",
"${If[${Me.Skill[slam]}!=255,1,0]}",
"${If[${meleemvi[plugin]} && ${Me.Skill[slam]}!=255,1,0]}",
};
PCHAR pSNEAK[]={
"sneak",
"[ON/OFF]?",
"0",
"${If[${meleemvi[plugin]} && ${Me.Skill[sneak]},1,0]}",
};
PCHAR pSTAND[]={
"standup",
"[ON/OFF] Authorize to StandUp?",
"0",
"${If[${meleemvi[plugin]},1,0]}",
};
PCHAR pSTIKR[]={
"stickrange",
"[#] Target in Range? 0=0ff",
"${If[${Stick.Status.NotEqual[NULL]},75,0]}",
"${If[${meleemvi[plugin]} && ${Stick.Status.NotEqual[NULL]},1,0]}",
};
PCHAR pSTIKD[]={
"stickdelay",
"[#] Sec to Wait Target in Range?",
"0",
"${If[${meleemvi[plugin]} && ${Stick.Status.NotEqual[NULL]} && ${meleemvi[stickrange]},1,0]}",
};
PCHAR pSTIKM[]={
"stickmode",
"[ON/OFF] Use stickcmd from ini?",
"0",
"${If[${meleemvi[plugin]} && ${Stick.Status.NotEqual[NULL]} && ${meleemvi[stickrange]},1,0]}",
};
PCHAR pSTRIK[]={
"strike",
"Use best sneak attack disc [ON/OFF]?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${meleemvi[backstab]} && ${meleemvi[idstrike]},1,0]}",
};
PCHAR pSTUNS[]={
"stunning",
"[#] Target Life% Below? 0=0ff",
"0",
"${If[${meleemvi[plugin]},1,0]}",
};
PCHAR pSTUN0[]={
"stun0",
"[ID] spell/disc/aa/item?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[stunning]},1,0]}",
};
PCHAR pSTUN1[]={
"stun1",
"[ID] spell/disc/aa/item?",
"0",
"${If[${meleemvi[plugin]} && ${meleemvi[stunning]},1,0]}",
};
PCHAR pTAUNT[]={
"taunt",
"[ON/OFF]?",
"${If[${Me.Skill[taunt]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${meleemvi[aggro]} && ${Me.Skill[taunt]},1,0]}",
};
PCHAR pTHIEF[]={
"thiefeye",
"[ON/OFF]?",
"${If[${Me.CombatAbility[thief's eye]},60,0]}",
"${If[${meleemvi[plugin]} && ${Me.CombatAbility[thief's eye]},1,0]}",
};
PCHAR pTHROW[]={
"throwstone",
"[#] Endu% Above? 0=0ff",
"0",
"${If[${meleemvi[plugin]} && ${Me.CombatAbility[throw stone]},1,0]}",
};
PCHAR pTIGER[]={
"tigerclaw",
"[ON/OFF]?",
"${If[${Me.Skill[tiger claw]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.Skill[tiger claw]},1,0]}",
};
PCHAR pTWIST[]={
"twistedshank",
"[ON/OFF]?",
"${If[${Me.AltAbility[twisted shank]},1,0]}",
"${If[${meleemvi[plugin]} && ${meleemvi[melee]} && ${Me.AltAbility[twisted shank]},1,0]}",
};
PCHAR UI_PetBack="BackButton";
PCHAR UI_PetAttk="AttackButton";
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
DWORD AACheck(DWORD id);
DWORD AAPoint(DWORD index);
BOOL AAReady(DWORD index);
LONG Aggroed(DWORD id);
FLOAT AngularDistance(float h1, float h2);
DOUBLE AngularHeading(PSPAWNINFO t, PSPAWNINFO s);
BOOL CACheck(DWORD id);
BOOL CAPress(DWORD id);
BOOL Casting(PCHAR command);
BOOL CursorEmpty();
LONG Discipline();
BOOL Equip(DWORD ID, long SlotID);
BOOL Equipped(DWORD id);
LONG Evaluate(PCHAR zFormat, ...);
LONG ItemCounts(DWORD ID, long B=0, long E=NUM_INV_SLOTS);
PCONTENTS ItemLocate(DWORD ID, long B=0, long E=NUM_INV_SLOTS, long SlotID=NOID);
LONG OkayToEquip(long Size=NOID);
LONG PackFind(long Size);
PMQPLUGIN Plugin(PCHAR PluginName);
VOID* PluginEntry(PCHAR PluginName, PCHAR FuncName);
BOOL SKCheck(DWORD id);
BOOL SKReady(DWORD id);
BOOL SKPress(DWORD id);
PCONTENTS SlotContent(long SlotID);
LONG SpawnMask(PSPAWNINFO x);
BOOL SpellCheck(DWORD id);
LONG SpellGemID(DWORD ID, LONG slotid=NOID);
BOOL SpellReady(DWORD ID, LONG SlotID=NOID);
BOOL Stick(PCHAR command);
LONG Unequip(long SlotID);
VOID WinClick(CXWnd *Wnd, PCHAR ScreenID, PCHAR ClickNotification, DWORD KeyState);
PSTR WinTexte(CXWnd *Wnd, PCHAR ScreenID, PSTR Buffer);
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
VOID Announce(DWORD Wanted, PCHAR Format, ...) {
char Output[MAX_STRING]={0}; va_list vaList; va_start(vaList,Format); vsprintf(Output,Format,vaList);
if(Output[0]) {
DWORD Result=0; PMQPLUGIN pPlugin=pPlugins;
while(pPlugin) {
fMQIncomingChat Request=(fMQIncomingChat)GetProcAddress(pPlugin->hModule,"OnMeleeChat");
if(Request) Result|=Request(Output,Wanted);
pPlugin=pPlugin->pNext;
}
if(!Result && Wanted) WriteChatf(Output);
}
}
#define GetSpawnID(spawnid) (PSPAWNINFO)GetSpawnByID(spawnid)
#define TargetIT(X) *(PSPAWNINFO*)ppTarget=X
static inline BOOL WinState(CXWnd *Wnd) {
return (Wnd && ((PCSIDLWND)Wnd)->Show);
}
static inline BOOL TypePack(PCONTENTS Item) {
return(Item && Item->Item->Type==ITEMTYPE_PACK);
}
static inline PSPAWNINFO Target() {
if(ppTarget) return (PSPAWNINFO)pTarget;
return NULL;
}
static inline BOOL TargetType(DWORD mask) {
return (SpawnMask(Target())&mask);
}
static inline BOOL TargetID(DWORD ID) {
if(ID && pTarget) return (ID==Target()->SpawnID);
return false;
}
static inline float SpeedRun(PSPAWNINFO x) {
if(x && x->Mount) return x->Mount->SpeedRun;
if(x) return x->SpeedRun;
return 0.0f;
}
static inline BOOL SpawnType(PSPAWNINFO x, DWORD mask) {
return (SpawnMask(x)&mask);
}
static inline PSPAWNINFO SpawnMe() {
return GetCharInfo()->pSpawn;
}
static inline PSPAWNINFO SpawnMount() {
return SpawnMe()?SpawnMe()->Mount:NULL;
}
static inline PSPAWNINFO SpawnPet() {
return (SpawnMe() && (LONG)SpawnMe()->PetID>0)?(PSPAWNINFO)GetSpawnByID(SpawnMe()->PetID):NULL;
}
static inline DWORD StandState() {
return SpawnMe()?SpawnMe()->StandState:0;
}
static inline BOOL Stackable(PCONTENTS Item) {
return (Item && Item->Item->Type==ITEMTYPE_NORMAL && ((EQ_Item*)Item)->IsStackable());
}
static inline LONG StackUnit(PCONTENTS Item) {
return (!Stackable(Item))?1:Item->StackCount;
}
static inline BOOL IsStunned() {
return (GetCharInfo() && GetCharInfo()->Stunned);
}
static inline BOOL IsStanding() {
if(SpawnMount()) return true;
return StandState()==STANDSTATE_STAND;
}
static inline BOOL IsSneaking() {
return (SpawnMe() && SpawnMe()->Sneak);
}
static inline BOOL IsInvisible() {
return (SpawnMe() && SpawnMe()->HideMode);
}
static inline BOOL IsGrouped() {
return (GetCharInfo() && GetCharInfo()->GroupLeader[0]);
}
static inline BOOL IsFeigning() {
return StandState()==STANDSTATE_FEIGN;
}
static inline BOOL IsCasting() {
return (SpawnMe() && ((SpawnMe()->CastingAnimation)&0xFF)!=0xFF);
}
static inline BOOL InRange(PSPAWNINFO a, PSPAWNINFO b, float d) {
if(!a || !b) return false;
return (DistanceToSpawn(a,b)<=d);
}
static inline BOOL InGame() {
return (gbInZone && gGameState==GAMESTATE_INGAME && SpawnMe() && GetCharInfo2() && GetCharInfo() && GetCharInfo()->Stunned!=3);
}
static inline CXWnd* XMLChild(CXWnd* window, PCHAR screenid) {
if(window) return window->GetChildItem(screenid);
return NULL;
}
static inline BOOL XMLEnabled(CXWnd* window) {
return (window && ((PCSIDLWND)window)->Enabled);
}
static inline PCONTENTS ContAmmo() {
if(PCHARINFO2 Me=GetCharInfo2()) return Me->Inventory.Ammo;
return NULL;
}
static inline PCONTENTS ContPrimary() {
if(PCHARINFO2 Me=GetCharInfo2()) return Me->Inventory.Primary;
return NULL;
}
static inline PCONTENTS ContRange() {
if(PCHARINFO2 Me=GetCharInfo2()) return Me->Inventory.Range;
return NULL;
}
static inline PCONTENTS ContSecondary() {
if(PCHARINFO2 Me=GetCharInfo2()) return Me->Inventory.Secondary;
return NULL;
}
static inline BOOL PokerType(PCONTENTS item) {
return (item && item->Item->ItemType==2);
}
static inline BOOL ShieldType(PCONTENTS item) {
return(item && item->Item->ItemType==8);
}
static inline BOOL TwohandType(PCONTENTS item) {
if(item) {
if(item->Item->ItemType==1) return true;
if(item->Item->ItemType==4) return true;
if(item->Item->ItemType==35) return true;
}
return false;
}
DWORD AACheck(DWORD id) {
if(pAltAdvManager)
if(PCHARINFO2 Me=GetCharInfo2())
if(_AALIST* AAList=Me->AAList)
if(id)
for(DWORD nAbility=0; nAbility<AA_CHAR_MAX_REAL; nAbility++)
if(LONG AAIndex=AAList[nAbility].AAIndex)
if(PALTABILITY ability=pAltAdvManager->GetAltAbility(AAIndex))
if(ability->ID==id) return AAIndex;
return false;
}
DWORD AAPoint(DWORD index) {
if(PCHARINFO2 Me=GetCharInfo2())
if(_AALIST* AAList=Me->AAList)
if(index)
for(DWORD nAbility=0; nAbility<AA_CHAR_MAX_REAL; nAbility++)
if(index==AAList[nAbility].AAIndex)
return AAList[nAbility].PointsSpent;
return 0;
}
BOOL AAReady(DWORD index) {
int result=0;
if(pAltAdvManager)
if(index)
if(PALTABILITY ability=pAltAdvManager->GetAltAbility(index))
if(pAltAdvManager->GetCalculatedTimer(pPCData,ability)>0)
pAltAdvManager->IsAbilityReady(pPCData,ability,&result);
return (result<0);
}
LONG Aggroed(DWORD id) {
if(PSPAWNINFO self=SpawnMe())
if(PSPAWNINFO kill=GetSpawnID(id))
if(PSPAWNINFO targ=Target()) {
if(targ==kill && self->SpawnID==self->TargetOfTarget) return 1; // im on hott
if(fabs(AngularHeading(kill,self))<8.0f) return 1; // it's facing me
if(FindSpeed(kill)>0.0f && kill->HPCurrent<20) return -1; // it's moving
if(InRange(self,targ,25.0f)) return -1; // close enough
}
return 0;
}
FLOAT AngularDistance(float h1, float h2) {
if(h1 == h2) return 0.0;
if(fabs(h1 - h2) > 256.0) * (h1 < h2?&h1:&h2) += 512.0;
return (fabs(h1 - h2) > 256.0)?(h2 - h1):(h1 - h2);
}
DOUBLE AngularHeading(PSPAWNINFO t, PSPAWNINFO s) {
double Head=t->Heading-(float)atan2(s->X - t->X, s->Y - t->Y) * 256.0 / PI;
if(Head > 256.0f) Head -= 512.0f; else if(Head < -256.0f) Head += 512.0f;
return Head;
}
BOOL CACheck(DWORD id) {
if(PCHARINFO2 Me=GetCharInfo2())
if(DWORD* CombatAbilities=Me->CombatAbilities)
if(id)
for(DWORD nCombat=0; nCombat<NUM_COMBAT_ABILITIES; nCombat++)
if(id==CombatAbilities[nCombat]) return true;
return false;
}
BOOL CAPress(DWORD id) {
pCharData->DoCombatAbility(id);
return true;
}
BOOL Casting(PCHAR command) {
typedef void (__cdecl *fCALL)(PSPAWNINFO,PCHAR);
if(fCALL request=(fCALL)PluginEntry("mq2cast","CastCommand")) {
Announce(SHOW_CASTING,"%s::Casting [\ay%s\ax].",PLUGIN_NAME,command);
request(NULL,command);
return true;
}
return false;
}
VOID Command(PCHAR zFormat,...) {
CHAR zOutput[MAX_STRING]={0}; va_list vaList; va_start(vaList,zFormat);
vsprintf(zOutput,zFormat,vaList);
if(zOutput[0]) EzCommand(zOutput);
}
BOOL CursorEmpty() {
if(PCHARINFO2 Me=GetCharInfo2())
if(!Me->Cursor)
if(!Me->CursorPlat)
if(!Me->CursorGold)
if(!Me->CursorSilver)
if(!Me->CursorCopper)
return true;
return false;
}
LONG Discipline() {
char temps[MAX_STRING];
PSPELL spell=GetSpellByName(WinTexte((CXWnd*)pCombatAbilityWnd,"CAW_CombatEffectLabel",temps));
return (spell)?spell->ID:0;
}
BOOL Equip(DWORD ID, long SlotID) {
if(!(SlotID < NUM_INV_SLOTS)) return false; // invalid destination slot id for equipping item to
if(!OkayToEquip()) return false; // can't equip item right casting or cursor not free
PCONTENTS fITEM=ItemLocate(ID,BAG_SLOT_START,NUM_INV_SLOTS); // assume that equipping item is in a backpack first
if(!fITEM) fITEM=ItemLocate(ID,0,BAG_SLOT_START); // was'nt found check if already equipped somewhere
if(!fITEM) return false; // was'nt found can't equip something we dont have
if(InvSlot != SlotID) {
// check class, level, deity and race to see if we have rights to equip this items.
if(!(fITEM->Item->Classes&(1<<((GetCharInfo2()->Class)-1)))) return false;
if(fITEM->Item->RequiredLevel > GetCharInfo2()->Level) return false;
if(fITEM->Item->Diety && !(fITEM->Item->Diety&(1<<(GetCharInfo2()->Deity-200)))) return false;
long MyRace=(DWORD)GetCharInfo2()->Race;
switch((DWORD)MyRace) {
case 128: MyRace=12; break;
case 130: MyRace=13; break;
case 330: MyRace=14; break;
case 522: MyRace=15; break;
default: MyRace--;
}
if(!(fITEM->Item->Races&(1<<MyRace))) return false;
if(SlotID==inv_primary && TwohandType(fITEM) && ContSecondary()) if(!Unequip(inv_secondary)) return false;
if(SlotID==inv_secondary && TwohandType(ContPrimary())) if(!Unequip(inv_primary)) return false;
long dSLOT=0;
if(PCONTENTS dCONT=GetCharInfo2()->InventoryArray[SlotID]) {
if(InvSlot<NUM_INV_SLOTS) dSLOT=InvSlot;
else {
PCONTENTS fPACK=GetCharInfo2()->InventoryArray[(InvSlot-262)/10+BAG_SLOT_START];
if(fPACK && fPACK->Item->SizeCapacity >= dCONT->Item->Size) dSLOT=InvSlot;
else dSLOT=PackFind(dCONT->Item->Size);
}
if(!dSLOT) return false;
}
char buffer[16];
sprintf(buffer,"InvSlot%d",SlotID);
pInvSlotMgr->MoveItem(InvSlot,NUM_INV_SLOTS,1,1);
WinClick((CXWnd*)pInventoryWnd,buffer,"leftmouseup",Nokey);
if(dSLOT) pInvSlotMgr->MoveItem(NUM_INV_SLOTS,dSLOT,1,1);
}
return true;
}
BOOL Equipped(DWORD id) {
if(id)
for(int i=0; i<BAG_SLOT_START; i++)
if(PCONTENTS Cont=GetCharInfo2()->InventoryArray)
if(id==Cont->Item->ItemNumber) return true;
return false;
}
LONG Evaluate(PCHAR zFormat, ...) {
char zOutput[MAX_STRING]={0}; va_list vaList; va_start(vaList,zFormat);
vsprintf(zOutput,zFormat,vaList); if(!zOutput[0]) return 1;
//DebugSpewAlways("E[%s]",zOutput);
ParseMacroData(zOutput);
//DebugSpewAlways("R[%s]",zOutput);
return atoi(zOutput);
}
LONG ItemCounts(DWORD ID, long B, long E) {
long Count=0; InvSlot=NOID; InvCont=NULL;
for(int iSlot=B; iSlot<E; iSlot++) {
if(PCONTENTS cSlot=GetCharInfo2()->InventoryArray[iSlot]) {
if(ID==cSlot->Item->ItemNumber) {
Count+=StackUnit(cSlot);
if(!InvCont) {
InvCont=cSlot;
InvSlot=iSlot;
}
} else if(TypePack(cSlot)) {
for(int iPack=0; iPack<cSlot->Item->Slots; iPack++) {
if(PCONTENTS cPack=cSlot->Contents[iPack]) {
if(ID==cPack->Item->ItemNumber) {
Count+=StackUnit(cPack);
if(!InvCont) {
InvCont=cPack;
InvSlot=262+iPack+(iSlot-BAG_SLOT_START)*10;
}
}
}
}
}
}
}
return Count;
}
PCONTENTS ItemLocate(DWORD ID, long B, long E, long SlotID) {
if(SlotID!=NOID)
if(PCONTENTS find=SlotContent(SlotID))
if(find->Item->ItemNumber==ID) {
InvSlot=SlotID;
return find;
}
for(int iSlot=B; iSlot<E; iSlot++)
if(PCONTENTS cSlot=GetCharInfo2()->InventoryArray[iSlot]) {
if(ID==cSlot->Item->ItemNumber) {
InvSlot=iSlot;
return cSlot;
}
if(TypePack(cSlot)) {
for(int iPack=0; iPack<cSlot->Item->Slots; iPack++)
if(PCONTENTS cPack=cSlot->Contents[iPack])
if(ID==cPack->Item->ItemNumber) {
InvSlot=(iSlot-BAG_SLOT_START)*10+iPack+262;
return cPack;
}
}
}
InvSlot=NOID;
return NULL;
}
LONG ItemTimer(PCONTENTS pItem) {
if(pItem->Item->Clicky.TimerID!=0xFFFFFFFF) return GetItemTimer(pItem);
if(pItem->Item->Clicky.SpellID!=0xFFFFFFFF) return 0;
return 999999;
}
LONG OkayToEquip(long Size) {
if(!CursorEmpty() || IsCasting()) return false;
if(Size!=NOID) return PackFind(Size);
return true;
}
LONG PackFind(long Size) {
long pSIZE=10;
long pSLOT=0;
for(int iSlot=BAG_SLOT_START; iSlot < NUM_INV_SLOTS; iSlot++) {
if(PCONTENTS cSlot=GetCharInfo2()->InventoryArray[iSlot]) {
if(TypePack(cSlot) && cSlot->Item->Combine != 2 &&
Size <= cSlot->Item->SizeCapacity && (!pSLOT || cSlot->Item->SizeCapacity < pSIZE)) {
for(int iPack=0; iPack < cSlot->Item->Slots; iPack++) {
if(!cSlot->Contents[iPack]) {
pSLOT=(iSlot-BAG_SLOT_START)*10+iPack+262;
pSIZE=cSlot->Item->SizeCapacity;
break;
}
}
}
} else if(!pSLOT) pSLOT=iSlot;
}
return pSLOT;
}
PMQPLUGIN Plugin(PCHAR PluginName) {
long Length=strlen(PluginName)+1;
PMQPLUGIN pLook=pPlugins;
while(pLook && strnicmp(PluginName,pLook->szFilename,Length)) pLook=pLook->pNext;
return pLook;
}
VOID* PluginEntry(PCHAR PluginName, PCHAR FuncName) {
if(PMQPLUGIN pLook=Plugin(PluginName))
if(void* entry=GetProcAddress(pLook->hModule,FuncName))
return entry;
return NULL;
}
BOOL SKCheck(DWORD id) {
if(id<100 && (pSkillMgr->pSkill[id]->Activated && GetCharInfo2()->Skill[id])) return true;
if(id>100 && id<128 && GetCharInfo2()->Skill[id]!=0xFF && strlen(szSkills[id])>3) return true;
return false;
}
BOOL SKReady(DWORD id) {
if(id<100) {
if(pSkillMgr->pSkill[id]->AltTimer==2) return gbAltTimerReady?true:false;
return EQADDR_DOABILITYAVAILABLE[id]?true:false;
}
if(id==111) return gbAltTimerReady?true:false;
if(id==105 || id==107) return LoH_HT_Ready();
return false;
}
BOOL SKPress(DWORD id) {
pCharData1->UseSkill((unsigned char)id,(EQPlayer*)pCharData1);
return true;
}
PCONTENTS SlotContent(long SlotID) {
if(SlotID>0) {
long InvSlot=NOID;
long SubSlot=NOID;
if(!(SlotID < NUM_INV_SLOTS)) {
InvSlot=BAG_SLOT_START+(SlotID-262)/10;
SubSlot=(SlotID-1)%10;
}
else InvSlot=SlotID;
if(InvSlot<NUM_INV_SLOTS) {
if(PCONTENTS cSlot=GetCharInfo2()->InventoryArray[InvSlot]) {
if(SubSlot<0) return cSlot;
if(PCONTENTS cPack=cSlot->Contents[SubSlot]) return cPack;
}
}
}
return NULL;
}
LONG SpawnMask(PSPAWNINFO x) {
if(!x) return st_x;
if(x->Type==SPAWN_PLAYER) return st_p;
if(x->Type==SPAWN_CORPSE) return x->Deity?st_cp:st_cn;
if(x->Type!=SPAWN_NPC) return st_x;
if(strstr(x->Name,"s_Mount")) return st_x;
if(!x->MasterID) return st_n;
PSPAWNINFO m=GetSpawnID(x->MasterID);
return (!m || m->Type!=SPAWN_PLAYER)?st_wn:st_wp;
}
BOOL SpellCheck(DWORD ID) {
if(ID)
if(PCHARINFO2 Me=GetCharInfo2())
for(DWORD nSlot=0; nSlot<NUM_BOOK_SLOTS; nSlot++)
if(ID==Me->SpellBook[nSlot])
return true;
return false;
}
LONG SpellGemID(DWORD ID, LONG SlotID) {
if(PCHARINFO2 Me=GetCharInfo2()) {
if(SlotID!=NOID && ID==Me->MemorizedSpells[SlotID]) return SlotID;
for(LONG GEM=0; GEM<GemsMax; GEM++)
if(ID==Me->MemorizedSpells[GEM])
return GEM;
}
return NOID;
}
BOOL SpellReady(DWORD ID, LONG SlotID) {
if(pCastSpellWnd)
if(PCHARINFO2 Me=GetCharInfo2()) {
DWORD GemID=(SlotID!=NOID)?SlotID:SpellGemID(ID);
if(GemID<(DWORD)GemsMax)
if(Me->MemorizedSpells[GemID]==ID)
if((LONG)((PEQCASTSPELLWINDOW)pCastSpellWnd)->SpellSlots[GemID]->spellicon!=NOID)
if(BardClass || (LONG)((PEQCASTSPELLWINDOW)pCastSpellWnd)->SpellSlots[GemID]->spellstate!=1)
return true;
}
return false;
}
BOOL Stick(PCHAR command) {
typedef void (__cdecl *fCALL)(PSPAWNINFO,PCHAR);
if(fCALL request=(fCALL)PluginEntry("mq2moveutils","StickCommand")) {
if(Evaluate("${If[${Stick.Active},1,0]}")) request(SpawnMe(),"off");
if(command[0]) {
Announce(SHOW_STICKING,"%s::Sticking [\ay%s\ax].",PLUGIN_NAME,command);
request(SpawnMe(),command);
}
Sticking=(command[0])?true:false;
strcpy(StickArg,Sticking?command:"OFF");
return true;
}
return false;
}
DWORD TimeSince(DWORD Timer) {
if(Timer) return (DWORD)clock()-Timer;
return 0;
}
LONG Unequip(long SlotID) {
if(SlotID<NUM_INV_SLOTS) {
PCONTENTS uCONT=GetCharInfo2()->InventoryArray[SlotID];
if(!uCONT) return true;
if(long uDEST=OkayToEquip(uCONT->Item->Size)) {
pInvSlotMgr->MoveItem(SlotID,NUM_INV_SLOTS,1,1);
pInvSlotMgr->MoveItem(NUM_INV_SLOTS,uDEST,1,1);
return true;
}
}
return false;
}
VOID WinClick(CXWnd *Wnd, PCHAR ScreenID, PCHAR ClickNotification, DWORD KeyState) {
if(Wnd) if(CXWnd *Child=Wnd->GetChildItem(ScreenID)) {
BOOL KeyboardFlags[4];
*(DWORD*)&KeyboardFlags=*(DWORD*)&((PCXWNDMGR)pWndMgr)->KeyboardFlags;
*(DWORD*)&((PCXWNDMGR)pWndMgr)->KeyboardFlags=KeyState;
SendWndClick2(Child,ClickNotification);
*(DWORD*)&((PCXWNDMGR)pWndMgr)->KeyboardFlags=*(DWORD*)&KeyboardFlags;
}
}
PSTR WinTexte(CXWnd *Wnd, PCHAR ScreenID, PSTR Buffer) {
Buffer[0]=0;
if(Wnd)
if(CXWnd *Child=(CXWnd*)Wnd->GetChildItem(ScreenID))
GetCXStr(Child->WindowText,Buffer,2047);
return Buffer;
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
class Ability {
CHAR COMM[16]; // Ability Cast Command
DWORD REUSE; // Ability Reuse Time
DWORD READY; // Ability Ready
LONG INDEX; // Ability Index
PSPELL EFFECT; // Ability Spell Effect
enum { UNKNOWN, ITEM, SKILL, DISC, AA, SPELL, CLICKY, POTION };
public:
LONG ID; // Ability ID
LONG TYPE; // Ability Type
CHAR NAME[128]; // Ability Name
BOOL SEARCH; // Ability Searched
BOOL Avail() {
SEARCH=1;
EFFECT=0;
if(ID>NOID) {
if(TYPE==SKILL || TYPE==UNKNOWN) {
if(SKCheck(ID)) {
strcpy(NAME,szSkills[ID]);
REUSE=(ID==i_forage)?101750:delay*3;
TYPE=SKILL;
return true;
}
}
if(TYPE==DISC || TYPE==UNKNOWN) {
if(CACheck(ID)) {
if(PSPELL spell=GetSpellByID(ID)) {
strcpy(NAME,spell->Name);
EFFECT=spell;
REUSE=spell->CastTime+spell->RecastTime+delay*6;
TYPE=DISC;
return true;
}
}
}
if(TYPE==AA || TYPE==UNKNOWN) {
if(long AAIndex=AACheck(ID)) {
if(PALTABILITY ability=pAltAdvManager->GetAltAbility(AAIndex)) {
if(PSPELL spell=GetSpellByID(ability->SpellID)) {
strcpy(NAME,pCDBStr->GetString(ability->nName,1,NULL));
sprintf(COMM,"%d|ALT",ID);
EFFECT=spell;
REUSE=pAltAdvManager->GetCalculatedTimer(pPCData,ability)*1000+spell->CastTime+delay*3;
INDEX=AAIndex;
TYPE=AA;
return true;
}
}
}
}
if(TYPE==SPELL || TYPE==UNKNOWN) {
if(SpellCheck(ID)) {
if(PSPELL spell=GetSpellByID(ID)) {
strcpy(NAME,spell->Name);
sprintf(COMM,"%d|GEM5",ID);
EFFECT=spell;
REUSE=spell->CastTime+spell->RecastTime+delay*3;
TYPE=SPELL;
return true;
}
}
}
if(TYPE==POTION || TYPE==CLICKY || TYPE==ITEM || TYPE==UNKNOWN) {
if(PCONTENTS find=ItemLocate(ID)) {
INDEX=InvSlot;
strcpy(NAME,find->Item->Name);
TYPE=ITEM;
if(PSPELL spell=GetSpellByID(find->Item->Clicky.SpellID)) {
sprintf(COMM,"%d|ITEM",ID);
EFFECT=spell;
REUSE=find->Item->Clicky.TimerID*1000+find->Item->CastTime+delay*3;
TYPE=(find->Item->ItemType==21)?POTION:CLICKY;
}
return true;
}
}
}
return false;
}
BOOL Found() {
if(!SEARCH) Avail();
return (ID>0 && TYPE!=UNKNOWN)?true:false;
}
LONG Check(string test) {
if(!Found()) return 0x01; // Ability Not Found
if((DWORD)clock()<=READY) return 0x02; // Ability Not Refreshed
if(TYPE==SKILL) {
if(SpawnMount()) switch(ID) {
case i_disarm: break;
case i_harmtouch: break;
case i_intimidation: break;
case i_kick: break;
case i_mend: break;
case i_taunt: break;
default: return 0x03; // Ability Do Not Work on Mount
}
if(!SKReady(ID)) return 0x13; // Ability Not Ready
} else if(EFFECT) {
if(!IsStanding()) return 0x05; // Not Standing
if(IsStunned()) return 0x06; // Stunned
if(TYPE>DISC) {
if(IsInvisible()) return 0x04; // Will Break Invisiblity
if(Silenced) return 0x07; // Silenced
}
if(IsCasting()) return 0x08; // already casting
if(WinState((CXWnd*)pSpellBookWnd)) return 0x09; // spellbook open
if(EFFECT->CARecastTimerID && ((DWORD)pPCData->GetCombatAbilityTimer(EFFECT->CARecastTimerID)-(DWORD)time(NULL))<0) return 0x16; // dicipline timer not ready
if((long)EFFECT->ReagentId[0]>0 && ItemCounts(EFFECT->ReagentId[0]) < (long)EFFECT->ReagentCount[0]) return 0x0A; // out of reagent
if(EFFECT->EnduranceCost && GetCharInfo2()->Endurance < EFFECT->EnduranceCost) return 0x0B; // out of endurance
if(EFFECT->Mana && GetCharInfo2()->Mana < EFFECT->Mana) return 0x0C; // out of mana
if(!EFFECT->SpellType) {
if(!pTarget) return 0x0D; // no target
float SpellRange=(EFFECT->Range)?EFFECT->Range:EFFECT->AERange;
if(SpellRange && !InRange(SpawnMe(),(PSPAWNINFO)pTarget,SpellRange)) return 0x0E; // out of range
} else if(EFFECT->DurationValue1>0) {
if(EFFECT->DurationWindow) {
for(int s=0; s<SongMax; s++) {
if(PSPELL buff=GetSpellByID(GetCharInfo2()->ShortBuff.SpellID)) {
if(EFFECT->ID==buff->ID) return 0x0F; // already have
if(!BuffStackTest(EFFECT,buff)) return 0x10; // not stacking
}
}
} else {
for(int b=0; b<BuffMax; b++) {
if(PSPELL buff=GetSpellByID(GetCharInfo2()->Buff.SpellID)) {
if(EFFECT->ID==buff->ID) return 0x0F; // already have
if(!BuffStackTest(EFFECT,buff)) return 0x10; // not stacking
}
}
}
}
if(TYPE>DISC && !Evaluate("${If[${Cast.Ready[%s]},1,0]}",COMM)) return 0x11; // mq2cast not ready
if(TYPE==AA) {
if(!AAReady(INDEX)) return 0x13; // Ability Not Ready
} else if(TYPE==SPELL) {
if(!pCastSpellWnd) return 0x12; // No Casting Spell Bar
INDEX=SpellGemID(ID,INDEX);
if(!SpellReady(ID,INDEX)) return 0x13; // Ability Not Ready
} else if(TYPE==POTION || TYPE==CLICKY) {
PCONTENTS find=ItemLocate(ID,0,NUM_INV_SLOTS,INDEX);
INDEX=InvSlot;
if(!find || !find->Charges || ItemTimer(find)) return 0x13; // Ability Not Ready
if(!CursorEmpty()) return 0x14; // Cursor Not Empty
}
}
if(!test.empty() && !Evaluate((PCHAR)test.c_str())) return 0x15; // User Condition Abort
return 0x00;
}
BOOL Ready(string test) {
LONG Result=Check(test);
if(DebugReady && Result) {
PCHAR Message="";
switch(Result) {
case 0x01: Message="NOT FOUND"; break;
case 0x02: Message="NOT REFRESHED"; break;
case 0x03: Message="NOT WORKING ON MOUNT"; break;
case 0x04: Message="WILL BREAK INVISIBILITY"; break;
case 0x05: Message="NOT STANDING"; break;
case 0x06: Message="STUNNED"; break;
case 0x07: Message="SILENCED"; break;
case 0x08: Message="ALREADY CASTING"; break;
case 0x09: Message="SPELLBOOK OPEN"; break;
case 0x0A: Message="OUT OF REAGENT"; break;
case 0x0B: Message="OUT OF ENDURANCE"; break;
case 0x0C: Message="OUT OF MANA"; break;
case 0x0D: Message="NO TARGET"; break;
case 0x0E: Message="OUT OF RANGE"; break;
case 0x0F: Message="ALREADY BUFFED WITH THIS"; break;
case 0x10: Message="BUFF NOT STACKING"; break;
case 0x11: Message="MQ2CAST NOT READY/FOUND"; break;
case 0x12: Message="NO SPELL BAR"; break;
case 0x13: Message="ABILITY NOT READY"; break;
case 0x14: Message="CURSOR NOT EMPTY"; break;
case 0x15: Message="USER CONDITION ABORT"; break;
case 0x16: Message="TIMER NOT READY"; break;
}
Announce(DebugReady,"Ability[%d][%d][%s] <<%s>>.",ID,TYPE,NAME,Message);
}
return (!Result);
}
BOOL Press() {
BOOL Casted=false;
if(Found() && (DWORD)clock()>READY) {
Announce(SHOW_ABILITY,"%s::Activate [\ay%s\ax].",PLUGIN_NAME,NAME);
if(TYPE==SKILL) Casted=SKPress(ID);
else if(TYPE==DISC) Casted=CAPress(ID);
else if(TYPE>=AA) Casted=Casting(COMM);
if(Casted) READY=(DWORD)clock()+REUSE;
}
return Casted;
}
void Setup(LONG id, LONG type) {
ID=id; // Ability ID?
TYPE=type; // Ability Type?
NAME[0]=0; // Ability Name?
COMM[0]=0; // Ability Command?
SEARCH=false; // Ability Searched?
READY=0; // Ability Ready Time
INDEX=NOID; // Ability Index
EFFECT=NULL; // Ability Spell Effect
}
Ability(LONG id, LONG type) {
Setup(id,type);
}
Ability() {
Setup(0,UNKNOWN);
}
};
class Option {
public:
PCHAR K; // key?
PCHAR H; // help?
PCHAR D; // default?
PCHAR S; // show?
string *C; // condition?
Ability *A; // ability?
LONG *V; // value?
Function F; // function?
BOOL U; // update?
Option(PCHAR k, PCHAR h, PCHAR d, PCHAR s, Function f, string *c) {
K=k; H=h; D=d; S=s; F=f; U=false; C=c; A=NULL; V=NULL;
}
Option(PCHAR k, PCHAR h, PCHAR d, PCHAR s, Function f, Ability *a) {
K=k; H=h; D=d; S=s; F=f; U=false; C=NULL; A=a; V=NULL;
}
Option(PCHAR k, PCHAR h, PCHAR d, PCHAR s, Function f, LONG *v) {
K=k; H=h; D=d; S=s; F=f; U=false; C=NULL; A=NULL; V=v;
}
void Write() {
if(K[0] && !C && Evaluate(S)) {
long value=(A)?A->ID:(V)?*V:0;
if(value>0) WriteChatf("%s::%s (\ag%d\ax) \ay%s\ax.",PLUGIN_NAME,K,value,H);
else WriteChatf("%s::%s (\ar0\ax) \ay%s\ax." ,PLUGIN_NAME,K,H);
}
}
void Setup(PCHAR value) {
if(C) *C=value;
else if(A) A->Setup(atol(value),0);
else if(V) {
if(!stricmp("false",value) || !stricmp("off",value)) *V=0;
else if(!stricmp("true",value) || !stricmp("on",value)) *V=1;
else *V=atol(value);
}
if(F) this->F();
}
void *Value() {
if(A) return &A->ID;
else if(V) return V;
else if(C) return C;
return NULL;
}
long Ready() {
if(A) return A->Ready("");
return NOID;
}
void Reset() {
if(K[0]) {
if(C) *C=D;
else {
strcpy(Reserved,D);
if(Reserved[0]) ParseMacroData(Reserved);
long value=atol(Reserved);
if(A) A->Setup(value,0);
else if(V) *V=value;
}
if(F) this->F();
}
}
};
typedef map<string,Option> Liste; // declare a type so more easy to refer
Liste CmdListe; // settings from command or ini
Liste IniListe; // settings from ini only
Liste VarListe; // settings from var liste
CHAR section[256]; // ini section
LONG doAGGRO,
doASSASINATE,
doBACKOFF,
doBACKSTAB,
doBASH,
doBEGGING,
doCALLCHALLENGE,
doCHALLENGEFOR,
doCOMMANDING,
doCRYHAVOC,
doDISARM,
doDRAGONPUNCH,
doEAGLESTRIKE,
doENRAGE,
doESCAPE,
doEVADE,
doFEIGNDEATH,
doFACING,
doFALLS,
doFERALSWIPE,
doFISTSOFWU,
doFLYINGKICK,
doFORAGE,
doFRENZY,
doHARMTOUCH,
doHIDE,
doINFURIATE,
doINTIMIDATION,
doJOLT,
doKICK,
doLAYHAND,
doLEOPARDCLAW,
doMELEE,
doMEND,
doPETASSIST,
doPETDELAY,
doPETRANGE,
doPETMEND,
doPICKPOCKET,
doSKILL,
doSTRIKE,
doPROVOKEMAX,
doPROVOKEONCE,
doPROVOKEEND,
doRAGEVOLLEY,
doRAKE,
doRANGE,
doRESUME,
doROUNDKICK,
doSENSETRAP,
doSLAM,
doSNEAK,
doSTAB,
doSTAND,
doSTICKDELAY,
doSTICKRANGE,
doSTICKMODE,
doSTUNNING,
doTAUNT,
doTHIEFEYE,
doTHROWSTONE,
doTIGERCLAW,
doTWISTEDSHANK,
doDOWNFLAG[8],
doPOTHEALFAST,
doPOTHEALOVER,
doHOLYFLAG[8];
LONG elARROWS,
elAGGROPRI,
elAGGROSEC,
elMELEEPRI,
elMELEESEC,
elPOKER,
elRANGED,
elSHIELD;
string ifBACKSTAB,
ifBASH,
ifBEGGING,
ifCALLCHALLENGE,
ifCHALLENGEFOR,
ifCOMMANDING,
ifCRYHAVOC,
ifDISARM,
ifDRAGONPUNCH,
ifEAGLESTRIKE,
ifEVADE,
ifFALLS,
ifFERALSWIPE,
ifFISTSOFWU,
ifFLYINGKICK,
ifFORAGE,
ifFRENZY,
ifHARMTOUCH,
ifHIDE,
ifINTIMIDATION,
ifJOLT,
ifKICK,
ifLAYHAND,
ifLEOPARDCLAW,
ifMEND,
ifPICKPOCKET,
ifPOTHEALFAST,
ifPOTHEALOVER,
ifPROVOKE,
ifRAGEVOLLEY,
ifRAKE,
ifROUNDKICK,
ifSENSETRAP,
ifSLAM,
ifSNEAK,
ifSTRIKE,
ifSTUNNING,
ifTAUNT,
ifTHIEFEYE,
ifTHROWSTONE,
ifTIGERCLAW,
ifTWISTEDSHANK,
DOWNSHIT[8],
HOLYSHIT[8],
StickCMD;
Ability idBACKSTAB,
idBASH,
idBEGGING,
idCALLCHALLENGE,
idCHALLENGEFOR,
idCOMMANDING,
idCRYHAVOC,
idDISARM,
idDRAGONPUNCH,
idEAGLESTRIKE,
idESCAPE,
idFEIGN[2],
idFERALSWIPE,
idFISTSOFWU,
idFLYINGKICK,
idFORAGE,
idFRENZY,
idHARMTOUCH,
idHIDE,
idINTIMIDATION,
idJOLT,
idKICK,
idLAYHAND,
idLEOPARDCLAW,
idMEND,
idPETMEND,
idPICKPOCKET,
idPOTHEALFAST,
idPOTHEALOVER,
idPROVOKE[2],
idRAGEVOLLEY,
idRAKE,
idROUNDKICK,
idSENSETRAP,
idSLAM,
idSNEAK,
idSTUN[2],
idSTRIKE,
idTAUNT,
idTIGERCLAW,
idTHIEFEYE,
idTHROWSTONE,
idTWISTEDSHANK;
DWORD Shrouded =false; // True when shrouded.
bool Binded =false; // Attack Key is Binded?
bool Loaded =false; // Loaded?
bool Moving =false; // Moving?
bool Immobile =false; // Immobilized?
bool AutoFire =false; // True when autofire is on.
bool HaveBash =false; // Have Two Hand Bash?
bool HaveHold =false; // Have Pet Hold?
DWORD BrokenFD =0; // Timer for Broken Feign Death
float Travel =0.0f; // Travel Speed?
long Health =0; // Current Health
DWORD MeleeTime =0; // Melee Pulse Timer
long MeleeTarg =0; // Melee Target ID
long MeleeType =0; // Melee Target Type
long MeleeFlee =0; // Melee Target Fleeing?
long MeleeLife =0; // Melee Target Life %
long MeleeCast =0; // Melee Target Cast ?
long MeleeSize =0; // Melee Name Size
char MeleeName[64] ={0}; // Melee Name
double MeleeSpeed =0.0f; // Melee Target Speed
double MeleeBack =0.0f; // Melee Target Angle Back
double MeleeView =0.0f; // Melee Target Angle View
double MeleeDist =0.0f; // Melee Distance to Target
double MeleeKill =0.0f; // Melee Distance to Use Ability
long onEVENT =false; // Ranged=0x8000,Begging=0x2000,PickPocket=0x1000,Feign=0x0040,Hide=0x0020,Backoff=0x0010,Infuriate=0x0002,Enrage=0x0001
long onSTICK =false; // Do Stick? (turn false when stick command is issue)
long onBELOW =false; // Below Flag? (turn false when no more provoke counter)
long onCHALLENGEFOR =false; // Challenge Flag? (turn to false when use once)
DWORD NPC_TYPE =0x000A; // NPC TYPE
char MeleeKey[32]; // Plugin Melee Key
char RangeKey[32]; // Plugin Range Key
DWORD PetInDist =0; // Pet Target in Range
DWORD PetOnAttk =0; // Pet Seen Attacking TimeStamp?
DWORD PetOnHold =0; // Pet Hold?
DWORD PetOnWait =0; // Pet Wait Assist Delay TimeStamp
DWORD PetTarget =0; // Pet Target ID
DWORD TimerAttk =0; // Timer Attk
DWORD TimerBack =0; // Timer BackOff/Escape/Feign
DWORD TimerMove =0; // Timer Move
DWORD TimerLife =0; // Timer Life (Target his dieing)
DWORD TimerFace =0; // Face Time Stamp when started
DWORD TimerStik =0; // Stik Time Stamp when started
DWORD TimerStun =0; // Timer Stun
long SwingHits =0; // Total Hits
long TakenHits =0; // Under Hits
long doHOLY=0; // Holy Shits while meleeing?
long doDOWN=0; // Down Shits while downtime?
Blech *pMeleeEvent=0; // blech event list
bool ColorArray[512]; // blech color filtering
bool IdlingArray[256]; // animation array while idle
bool AttackArray[256]; // animation array while attacking
long SaveList[50]; // saved event list
long SaveIndx; // saved event counters
DWORD HiddenTimer =0; // Last TimeStamp for Hide
DWORD SilentTimer =0; // Last TimeStamp for Sneak
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
class MQ2MeleeType *pMeleeTypes=0;
class MQ2MeleeType : public MQ2Type {
private:
long isKill;
char Tempos[MAX_STRING];
public:
enum Information {
Enable=1,
Combat=2,
Casted=3,
Engage=4,
Status=5,
Target=6,
DiscID=7,
Enrage=8,
Infuriate=9,
AggroMode=10,
MeleeMode=11,
RangeMode=12,
BackAngle=13,
ViewAngle=14,
Immobilize=15,
Ammunition=16,
BackStabbing=17,
GotAggro=18,
Hidden=19,
Silent=20,
NumHits=21,
};
MQ2MeleeType():MQ2Type("Melee") {
TypeMember(Enable);
TypeMember(Combat);
TypeMember(Casted);
TypeMember(Status);
TypeMember(Target);
TypeMember(DiscID);
TypeMember(GotAggro);
TypeMember(AggroMode);
TypeMember(MeleeMode);
TypeMember(RangeMode);
TypeMember(Enrage);
TypeMember(Infuriate);
TypeMember(BackAngle);
TypeMember(ViewAngle);
TypeMember(Immobilize);
TypeMember(Ammunition);
TypeMember(BackStabbing);
TypeMember(Hidden);
TypeMember(Silent);
TypeMember(NumHits);
}
bool GetMember(MQ2VARPTR VarPtr, PCHAR Member, PCHAR Index, MQ2TYPEVAR &Dest) {
PMQ2TYPEMEMBER pMember=MQ2MeleeType::FindMember(Member);
isKill=false; if(doSKILL) if(MeleeTarg) isKill=true;
if(pMember) switch((Information)pMember->ID) {
case Enable:
Dest.DWord=doSKILL;
Dest.Type=pBoolType;
return true;
case Combat:
Dest.DWord=isKill;
Dest.Type=pBoolType;
return true;
case Casted:
Dest.Int=(isKill && MeleeCast)?labs((DWORD)clock()-MeleeCast):60000;
Dest.Type=pIntType;
return true;
case Status:
Tempos[0]=0;
if(isKill) strcat(Tempos,"ENGAGED ");
else strcat(Tempos,"WAITING ");
if(*EQADDR_ATTACK) strcat(Tempos, "MELEE ");
else if(onEVENT&0x8000) strcat(Tempos,"RANGE ");
if(onEVENT&0x0001) strcat(Tempos,"ENRAGE ");
if(onEVENT&0x0002) strcat(Tempos,"INFURIATE ");
if(onEVENT&0x0010) strcat(Tempos,"BACKING ");
if(onEVENT&0x0020) strcat(Tempos,"ESCAPING ");
if(onEVENT&0x0040) strcat(Tempos,"FEIGNING ");
if(onEVENT&0x0200) strcat(Tempos,"EVADING ");
if(onEVENT&0x0400) strcat(Tempos,"FALLING ");
if(onEVENT&0x1000) strcat(Tempos,"STEALING ");
if(onEVENT&0x2000) strcat(Tempos,"BEGGING ");
Dest.Type=pStringType;
Dest.Ptr=Tempos;
return true;
case Target:
Dest.Int=isKill?MeleeTarg:0;
Dest.Type=pIntType;
return true;
case DiscID:
Dest.DWord=Discipline();
Dest.Type=pIntType;
return true;
case GotAggro:
Dest.DWord=(Aggroed(MeleeTarg)>0);
Dest.Type=pBoolType;
return true;
case AggroMode:
Dest.DWord=doAGGRO;
Dest.Type=pBoolType;
return true;
case MeleeMode:
Dest.DWord=doMELEE;
Dest.Type=pBoolType;
return true;
case RangeMode:
Dest.DWord=doRANGE;
Dest.Type=pBoolType;
return true;
case Enrage:
Dest.DWord=onEVENT&0x0001;
Dest.Type=pBoolType;
return true;
case Infuriate:
Dest.DWord=onEVENT&0x0002;
Dest.Type=pBoolType;
return true;
case BackAngle:
Dest.Float=pTarget?AngularDistance(((PSPAWNINFO)pTarget)->Heading,SpawnMe()->Heading):0.0f;
Dest.Type=pFloatType;
return true;
case ViewAngle:
Dest.Float=pTarget?(float)AngularHeading(SpawnMe(),(PSPAWNINFO)pTarget):0.0f;
Dest.Type=pFloatType;
return true;
case Immobilize:
Dest.DWord=Immobile;
Dest.Type=pBoolType;
return true;
case Ammunition:
Dest.DWord=ItemCounts(elARROWS);
if(PCONTENTS r=GetCharInfo2()->Inventory.Ammo)
if(r->Item->ItemNumber != elARROWS)
if(r->Item->ItemType==7 || r->Item->ItemType==19 || r->Item->ItemType==27)
Dest.DWord=ItemCounts(r->Item->ItemNumber);
Dest.Type=pIntType;
return true;
case BackStabbing:
Dest.DWord=doBACKSTAB;
Dest.Type=pBoolType;
return true;
case Hidden:
Dest.Int=TimeSince(HiddenTimer);
Dest.Type=pIntType;
return true;
case Silent:
Dest.Int=TimeSince(SilentTimer);
Dest.Type=pIntType;
return true;
case NumHits:
Dest.DWord=SwingHits;
Dest.Type=pIntType;
return true;
}
strcpy(Tempos,"NULL");
Dest.Type=pStringType;
Dest.Ptr=Tempos;
return true;
}
bool ToString(MQ2VARPTR VarPtr, PCHAR Destination) {
strcpy(Destination,"TRUE");
return true;
}
bool FromData(MQ2VARPTR &VarPtr, MQ2TYPEVAR &Source) {
return false;
}
bool FromString(MQ2VARPTR &VarPtr, PCHAR Source) {
return false;
}
~MQ2MeleeType() { }
};
BOOL DataMelee(PCHAR Index, MQ2TYPEVAR &Dest) {
Dest.Type=pMeleeTypes;
Dest.DWord=1;
return true;
}
BOOL datameleemvb(PCHAR Index, MQ2TYPEVAR &Dest) {
Dest.Type=pIntType;
Dest.Int=NOID;
Liste::iterator c;
if(VarListe.end()!=(c=VarListe.find(Index)))
Dest.Int=(*c).second.Ready();
return true;
}
BOOL datameleemvi(PCHAR Index, MQ2TYPEVAR &Dest) {
Dest.Type=pIntType;
Dest.DWord=0;
Liste::iterator c;
if(CmdListe.end()!=(c=CmdListe.find(Index))) {
if(long *V=(long*)(*c).second.Value()) Dest.DWord=*V;
return true;
}
if(VarListe.end()!=(c=VarListe.find(Index))) {
if(long *V=(long*)(*c).second.Value()) Dest.DWord=*V;
return true;
}
return true;
}
BOOL datameleemvs(PCHAR Index, MQ2TYPEVAR &Dest) {
Dest.Type=pStringType;
Dest.Ptr=&Workings;
Liste::iterator c=IniListe.find(Index);
if(IniListe.end()!=c) {
if(string *S=(string*)(*c).second.Value())
strcpy(Workings,S->c_str());
} else Workings[0]=0;
return true;
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
void AbilityFind(Ability *thisone, infodata *first, ...) {
infodata *c=first;
va_list marker;
va_start(marker,first);
while(c) {
thisone->Setup(c->i,c->t);
if(thisone->Avail()) break;
thisone->ID=0;
c=va_arg(marker,infodata *);
}
va_end(marker);
}
void AttackON() {
if(*EQADDR_ATTACK || onEVENT&0xFFF7 || IsFeigning() || !doMELEE || !TargetID(MeleeTarg)) return;
EzCommand("/attack on");
TimerAttk=(DWORD)clock();
}
void AttackOFF() {
if(*EQADDR_ATTACK) EzCommand("/attack off");
}
bool BashCheck() {
if(ShieldType(ContSecondary())) return true;
if(TwohandType(ContPrimary())) return HaveBash;
return (elSHIELD && ItemCounts(elSHIELD) && OkayToEquip(Giant));
}
void BashPress() {
long savedpri=0; long savedoff=0; BOOL got2hand=false;
if(PCONTENTS pri=ContPrimary()) {
got2hand=TwohandType(pri);
savedpri=pri->Item->ItemNumber;
}
if(PCONTENTS off=ContSecondary()) savedoff=off->Item->ItemNumber;
if(elSHIELD && ItemCounts(elSHIELD) && OkayToEquip(Giant)) Equip(elSHIELD,inv_secondary);
if(ShieldType(ContSecondary()) || (got2hand && HaveBash)) idBASH.Press();
if(savedoff) Equip(savedoff,inv_secondary);
if(savedpri) Equip(savedpri,inv_primary);
}
void Configure() {
long Class=GetCharInfo2()->Class;
long Races=GetCharInfo2()->Race;
long Level=GetCharInfo2()->Level;
sprintf(INIFileName,"%s\\%s_%s.ini",gszINIPath,EQADDR_SERVERNAME,GetCharInfo()->Name);
sprintf(section,"%s_%d_%s_%s",PLUGIN_NAME,Level,pEverQuest->GetRaceDesc(Races),pEverQuest->GetClassDesc(Class));
Shrouded=GetCharInfo2()->Shrouded; if(!Shrouded) section[strlen(PLUGIN_NAME)]=0;
BuffMax=15;
if(GetAAIndexByName("Embrace of the Dark Reign")) BuffMax++;
else if(GetAAIndexByName("Embrace of the Keepers")) BuffMax++;
BuffMax+=(AAPoint(GetAAIndexByName("Mystical Attuning")))/5;
if(SpawnMe()->Level>71) BuffMax++;
if(SpawnMe()->Level>74) BuffMax++;
HaveHold=GetAAIndexByName("Pet Discipline")?true:false;
HaveBash=GetAAIndexByName("2 Hand Bash")?true:false;
BardClass=false;
char keys[MAX_STRING*5];
char temp[MAX_STRING];
Liste::iterator c,i;
Liste::iterator ec=CmdListe.end();
Liste::iterator ei=IniListe.end();
for(c=CmdListe.begin(); c!=ec; c++) (*c).second.Reset();
for(i=IniListe.begin(); i!=ei; i++) (*i).second.Reset();
idCHALLENGEFOR.Setup(0,0);
idFEIGN[0].Setup (0,0);
idFEIGN[1].Setup (0,0);
idFERALSWIPE.Setup (0,0);
idJOLT.Setup (0,0);
idLEOPARDCLAW.Setup (0,0);
idPETMEND.Setup (0,0);
idPROVOKE[0].Setup (0,0);
idPROVOKE[1].Setup (0,0);
idRAGEVOLLEY.Setup (0,0);
idRAKE.Setup (0,0);
idSTRIKE.Setup (0,0);
idSTUN[0].Setup (0,0);
idSTUN[1].Setup (0,0);
AbilityFind(&idBACKSTAB,&sbkstab,0);
AbilityFind(&idBASH,&sbash,0);
AbilityFind(&idBEGGING,&sbegging,0);
AbilityFind(&idDISARM,&sdisarm,0);
AbilityFind(&idDRAGONPUNCH,&sdrpunch,0);
AbilityFind(&idEAGLESTRIKE,&sestrike,0);
AbilityFind(&idFLYINGKICK,&sflykick,0);
AbilityFind(&idFORAGE,&sforage,0);
AbilityFind(&idFRENZY,&sfrenzy,0);
AbilityFind(&idHARMTOUCH,&sharmtou,0);
AbilityFind(&idHIDE,&shide,0);
AbilityFind(&idINTIMIDATION,&sintim,0);
AbilityFind(&idKICK,&skick,0);
AbilityFind(&idLAYHAND,&layhand,0);
AbilityFind(&idMEND,&smend,0);
AbilityFind(&idPICKPOCKET,&sppocket,0);
AbilityFind(&idROUNDKICK,&srndkick,0);
AbilityFind(&idSENSETRAP,&ssensetr,0);
AbilityFind(&idSLAM,&sslam,0);
AbilityFind(&idSNEAK,&ssneak,0);
AbilityFind(&idTAUNT,&staunt,0);
AbilityFind(&idTIGERCLAW,&stigclaw,0);
AbilityFind(&idCALLCHALLENGE,&callchal,0);
AbilityFind(&idESCAPE,&escape,0);
AbilityFind(&idTWISTEDSHANK,&twisted,0);
AbilityFind(&idTHROWSTONE,&tstone,0);
AbilityFind(&idCOMMANDING,&cmmding,0);
AbilityFind(&idFISTSOFWU,&fistswu,0);
AbilityFind(&idTHIEFEYE,&thiefeye,0);
AbilityFind(&idCRYHAVOC,&cryhavoc,0);
AbilityFind(&idPOTHEALOVER,&potover9,&potover8,&potover7,&potover6,&potover5,&potover4,&potover3,&potover2,&potover1,&potover0,0);
AbilityFind(&idPOTHEALFAST,&potfast9,&potfast8,&potfast7,&potfast6,&potfast5,&potfast4,&potfast3,&potfast2,&potfast1,&potfast0,0);
doSTAB=0;
switch(Class) {
case 1: // WAR
AbilityFind(&idPROVOKE[1],&prowar_m,&prowar_l,&prowar_k,&prowar_j,&prowar_i,&prowar_h,&prowar_g,&prowar_f,&prowar_e,&prowar_d,&prowar_c,&prowar_b,&prowar_a,0);
break;
case 3: // PAL
AbilityFind(&idCHALLENGEFOR,&honorf,&honore,&honord,&honorc,&honorb,&honora,0);
AbilityFind(&idPROVOKE[0],&stunpal3,&stunpal2,&stunpal1,0);
AbilityFind(&idPROVOKE[1],&stunpalm,&stunpall,&stunpalk,&stunpalj,&stunpali,&stunpalh,&stunpalg,&stunpalf,&stunpale,&stunpald,&stunpalc,&stunpalb,&stunpala,0);
AbilityFind(&idSTUN[0],&stunpal3,&stunpal2,&stunpal1,0);
AbilityFind(&idSTUN[1],&stunpalm,&stunpall,&stunpalk,&stunpalj,&stunpali,&stunpalh,&stunpalg,&stunpalf,&stunpale,&stunpald,&stunpalc,&stunpalb,&stunpala,0);
break;
case 4: // RNG
AbilityFind(&idJOLT,&joltrng5,&joltrng4,&joltrng3,&joltrng2,&joltrng1,0);
break;
case 5: // SHD
AbilityFind(&idFEIGN[0],&feignsl,&feignsk,&feignsj,&feignsi,&feignsh,&feignsg,&feignsf,&feignse,&feignsd,&feignsc,&feignsb,&feignsa,0);
AbilityFind(&idFEIGN[1],&feigndp,0);
AbilityFind(&idCHALLENGEFOR,&powerf,&powere,&powerd,&powerc,&powerb,&powera,0);
AbilityFind(&idPROVOKE[1],&terrorj,&terrori,&terrorh,&terrorg,&terrorf,&terrore,&terrord,&terrorc,&terrorb,&terrora,0);
break;
case 7: // MNK
AbilityFind(&idFEIGN[0],&sfeign,0);
AbilityFind(&idFEIGN[1],&feignid,0);
AbilityFind(&idPROVOKE[0],&stunmnk2,&stunmnk1,0);
AbilityFind(&idSTUN[0],&stunmnk2,&stunmnk1,0);
AbilityFind(&idLEOPARDCLAW,&leop8,&leop7,&leop6,&leop5,&leop4,&leop3,&leop2,&leop1,0);
break;
case 8: // BRD
BardClass=true;
break;
case 9: // ROG
AbilityFind(&idSTRIKE,&strikej,&strikei,&strikeh,&strikeg,&strikef,&strikee,&striked,&strikec,&strikeb,&strikea,0);
switch(AAPoint(GetAAIndexByName("Seized Opportunity"))) {
case 60: doSTAB=256; break;
case 39: doSTAB=192; break;
case 18: doSTAB=128; break;
default: doSTAB=64; break;
}
break;
case 11: // NEC
AbilityFind(&idFEIGN[0],&feignsc,&feignsb,&feignsa,0);
AbilityFind(&idFEIGN[1],&feigndp,0);
AbilityFind(&idPETMEND,&mendpet2,&mendpet1,0);
break;
case 13: // MAG
AbilityFind(&idPETMEND,&mendpet2,&mendpet1,0);
break;
case 15: // BST
AbilityFind(&idRAKE,&rake4,&rake3,&rake2,&rake1,0);
AbilityFind(&idFERALSWIPE,&feral1,0);
AbilityFind(&idPETMEND,&mendpet1,&mendpet2,0);
AbilityFind(&idJOLT,&joltbst1,0);
break;
case 16: // BER
AbilityFind(&idJOLT,&joltberj,&joltberi,&joltberh,&joltberg,&joltberf,&joltbere,&joltberd,&joltberc,&joltberb,&joltbera,0);
AbilityFind(&idRAGEVOLLEY,&volleyk,&volleyj,&volleyi,&volleyh,&volleyg,&volleyf,&volleye,&volleyd,&volleyc,&volleyb,&volleya,0);
AbilityFind(&idPROVOKE[1],&stunberj,&stunberi,&stunberh,&stunberg,&stunberf,&stunbere,&stunberd,&stunberc,&stunberb,&stunbera,0);
AbilityFind(&idSTUN[1],&stunberj,&stunberi,&stunberh,&stunberg,&stunberf,&stunbere,&stunberd,&stunberc,&stunberb,&stunbera,0);
break;
}
if(GetPrivateProfileString(section,NULL,"",keys,sizeof(keys),INIFileName)) {
PCHAR pkeys=keys;
while(pkeys[0]) {
if(GetPrivateProfileString(section,pkeys,"",temp,sizeof(temp),INIFileName)) {
_strlwr(pkeys);
if(ec!=(c=CmdListe.find(pkeys))) (*c).second.Setup(temp);
else if(ei!=(i=IniListe.find(pkeys))) (*i).second.Setup(temp);
}
pkeys+=strlen(pkeys)+1;
}
}
Loaded=true;
}
void Exporting() {
char output[MAX_STRING];
char defval[MAX_STRING];
Liste::iterator c,e;
WritePrivateProfileString(section,NULL,NULL,INIFileName);
e=CmdListe.end();
for(c=CmdListe.begin(); c!=e; c++) {
output[0]=0;
if((*c).second.C)
if(string *S=(string*)(*c).second.Value())
strcpy(output,S->c_str());
if((*c).second.A || (*c).second.V)
if(long *V=(long*)(*c).second.Value())
itoa(*V,output,10);
if(output[0]) {
strcpy(defval,(*c).second.D);
if(defval[0]) ParseMacroData(defval);
if(strcmp(output,"0") || strcmp(output,defval))
WritePrivateProfileString(section,(*c).second.K,output,INIFileName);
}
}
e=IniListe.end();
for(c=IniListe.begin(); c!=e; c++) {
output[0]=0;
if((*c).second.C)
if(string *S=(string*)(*c).second.Value())
strcpy(output,S->c_str());
if((*c).second.A || (*c).second.V)
if(long *V=(long*)(*c).second.Value())
itoa(*V,output,10);
if(output[0]) {
strcpy(defval,(*c).second.D);
if(defval[0]) ParseMacroData(defval);
if(strcmp(output,"0") || strcmp(output,defval))
WritePrivateProfileString(section,(*c).second.K,output,INIFileName);
}
}
sprintf(output,"%1.3f",PLUGIN_VERS); WritePrivateProfileString(section,"version",output,INIFileName);
}
void MapInsert(Liste *MyList, Option MyOption) {
MyList->insert(Liste::value_type(MyOption.K,MyOption));
}
void MeleeHelp() {
WriteChatf("%s::-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-",PLUGIN_NAME);
WriteChatf("%s::Version [\ag%1.3f\ax] Loaded!",PLUGIN_NAME,PLUGIN_VERS);
WriteChatf("%s::-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-",PLUGIN_NAME);
for(Liste::iterator i=CmdListe.begin(); i!=CmdListe.end(); i++) (*i).second.Write();
WriteChatf("%s::-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-",PLUGIN_NAME);
if(NULL==PluginEntry("mq2cast","CastCommand"))
WriteChatf("%s::Required Latest [\arMQ2Cast\ax] for AA/SPELL/ITEM casting.",PLUGIN_NAME);
if(NULL==PluginEntry("mq2moveutils","StickCommand"))
WriteChatf("%s::Required Latest [\arMQ2MoveUtils\ax] for MOVEMENT.",PLUGIN_NAME);
}
void PetSEEN() {
PetOnAttk=(DWORD)clock()+6000;
PetOnHold=false;
}
void PetBACK() {
PetOnHold=true;
if(doPETASSIST && pPetInfoWnd && XMLEnabled(XMLChild((CXWnd*)pPetInfoWnd,UI_PetBack))) {
Announce(SHOW_CONTROL,"%s::Command [\ay%s\ax].",PLUGIN_NAME,"/pet back");
EzCommand("/pet back");
}
}
void PetATTK() {
PetSEEN();
if(doPETASSIST && pPetInfoWnd && !(onEVENT&0x0003) && MeleeTarg && XMLEnabled(XMLChild((CXWnd*)pPetInfoWnd,UI_PetAttk))) {
Announce(SHOW_CONTROL,"%s::Command [\ay%s\ax].",PLUGIN_NAME,"/pet attack");
if(!TargetID(MeleeTarg)) {
PSPAWNINFO Current=Target();
TargetIT(GetSpawnID(MeleeTarg));
EzCommand("/pet attack");
if(Current) Command("/squelch /target id %d",Current->SpawnID);
} else {
EzCommand("/pet attack");
}
PetTarget=MeleeTarg;
}
}
void StickReset() {
TimerStik=0;
if(Sticking) Stick("");
StickArg[0]=0;
onSTICK=(doMELEE && doSTICKRANGE && !(onEVENT&0x8000) && Plugin("mq2moveutils"));
}
void RangeReset() {
if(!doRANGE && AutoFire) EzCommand("/autofire");
if(!doRANGE && (onEVENT&0x8000)) onEVENT&=0x7FFF;
}
void OtherReset() {
MeleeTarg=0;
MeleeType=0;
MeleeLife=0;
MeleeCast=0;
MeleeFlee=0;
TimerBack=0;
TimerLife=0;
TimerFace=0;
TimerStun=0;
PetTarget=0;
PetOnWait=0;
SwingHits=0;
TakenHits=0;
onEVENT=0;
doDOWN=0;
doHOLY=0;
}
void MeleeReset() {
if(!doMELEE && *EQADDR_ATTACK) {
AttackOFF();
StickReset();
}
}
void AggroReset() {
BOOL onAGGRO=(doAGGRO && IsGrouped());
onCHALLENGEFOR=(onAGGRO && idCHALLENGEFOR.Found());
onBELOW=(onAGGRO && doPROVOKEMAX)?doPROVOKEMAX:0;
if(doMELEE) {
if(LONG PW=(IsGrouped() && doAGGRO)?elAGGROPRI:elMELEEPRI) Equip(PW,inv_primary);
if(LONG SW=(IsGrouped() && doAGGRO)?elAGGROSEC:elMELEESEC) Equip(SW,inv_secondary);
}
}
VOID SneakOFF() {
if(IsSneaking() && idSNEAK.Found()) idSNEAK.Press();
}
VOID HideOFF() {
if(IsInvisible() && idHIDE.Found()) idHIDE.Press();
}
BOOL StabCheck() {
if(elPOKER && OkayToEquip(Giant) && PokerType(ItemLocate(elPOKER))) return true;
return PokerType(ContPrimary());
}
void StabPress() {
long saveid=0;
if(elPOKER && OkayToEquip(Giant) && ItemLocate(elPOKER,0,NUM_INV_SLOTS,InvSlot)) {
if(PCONTENTS pri=ContPrimary())
if(pri->Item->ItemNumber!=elPOKER) {
saveid=pri->Item->ItemNumber;
Equip(elPOKER,inv_primary);
}
}
if(PokerType(ContPrimary())) {
idBACKSTAB.Press();
SwingHits++;
}
if(saveid) Equip(saveid,inv_primary);
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
PLUGIN_API VOID ThrowIT(PSPAWNINFO pChar, PCHAR Cmd) {
if(gbRangedAttackReady && pTarget && TargetType(NPC_TYPE) &&
!InRange(SpawnMe(),(PSPAWNINFO)pTarget,35) &&
fabs(AngularHeading(SpawnMe(),(PSPAWNINFO)pTarget))<50 &&
LineOfSight(SpawnMe(),(PSPAWNINFO)pTarget)) {
// test if we could do ranged with current ammo/range configuration
long crT=99; long crI=0; long caT=99; long caI=0; long caQ=0;
if(PCONTENTS r=ContRange()) {
crI=r->Item->ItemNumber;
crT=r->Item->ItemType;
}
if(PCONTENTS a=ContAmmo()) {
caI=a->Item->ItemNumber;
caT=a->Item->ItemType;
if(caT == 7 || caT == 19 || caT == 27) caQ=ItemCounts(caI);
}
if(!(caI && ((caT == 27 && crT == 5) || (caI == crI && (caT == 7 || caT == 19))))) {
if(!OkayToEquip(Giant)) return;
// grab information about user defined range/ammunition
long erT=99; long eaT=99; long eaQ=0;
if(PCONTENTS r=ItemLocate(elRANGED)) erT=r->Item->ItemType;
if(PCONTENTS a=ItemLocate(elARROWS)) {
eaT=a->Item->ItemType;
if(eaT == 7 || eaT == 19 || eaT == 27) eaQ=ItemCounts(elARROWS);
}
// find equipping scenario (bow+arrow) or (throw/throw).
long EquipRangeID=0; long EquipArrowID=0;
if((crT == 5 || erT == 5) && (caT == 27 || eaT == 27)) {
EquipRangeID=(crT== 5)?crI:elRANGED;
EquipArrowID=(caT==27)?caI:elARROWS;
}
else if((caQ > 2 && (caT == 7 || caT == 19)) || (eaQ > 2 && (eaT == 7 || eaT == 19)))
{
EquipRangeID=(caQ>2 &&(caT==7 || caT==19))?caI:elARROWS;
EquipArrowID=(caQ>2 &&(caT==7 || caT==19))?caI:elARROWS;
}
else return;
// load equipping scenario found!
if(EquipRangeID && EquipArrowID) {
if(crI!=EquipRangeID) Equip(EquipRangeID,inv_range);
if(caI!=EquipArrowID) Equip(EquipArrowID,inv_ammo);
if(EquipArrowID==EquipRangeID && !ContRange()) {
WinClick((CXWnd*)pInventoryWnd,"InvSlot22","leftmouseup",Ctrlkey); // pick one from ammo
WinClick((CXWnd*)pInventoryWnd,"InvSlot11","leftmouseup",Shiftkey); // fill one in range
}
}
}
// more sanity double check in case we didnt exchange stuff
PCONTENTS rSlot=ContRange(); if(!rSlot) return;
PCONTENTS aSlot=ContAmmo(); if(!aSlot) return;
long rType=rSlot->Item->ItemType; if(!(rType == 5 || rType == 7 || rType == 19)) return;
long aType=aSlot->Item->ItemType; if(!(aType == 7 || aType == 19 || aType == 27)) return;
long aKind=aSlot->Item->ItemNumber; long rKind=rSlot->Item->ItemNumber;
if(!((aType == 27 && rType == 5) || (aType!=27 && rKind == aKind))) return;
// good time to reload ammunitions?
if(OkayToEquip()) {
while(aSlot->StackCount < 80 && ItemCounts(aKind,BAG_SLOT_START)>0) {
ItemLocate(aKind,BAG_SLOT_START);
pInvSlotMgr->MoveItem(InvSlot,NUM_INV_SLOTS,1,1);
WinClick((CXWnd*)pInventoryWnd,"InvSlot22","leftmouseup",Shiftkey);
if(!CursorEmpty()) pInvSlotMgr->MoveItem(NUM_INV_SLOTS,InvSlot,1,1);
}
if(aType != 27 && aKind == rKind) {
while(rSlot->StackCount < 80 && ItemCounts(aKind,BAG_SLOT_START)>0) {
ItemLocate(aKind,BAG_SLOT_START);
pInvSlotMgr->MoveItem(InvSlot,NUM_INV_SLOTS,1,1);
WinClick((CXWnd*)pInventoryWnd,"InvSlot22","leftmouseup",Shiftkey);
WinClick((CXWnd*)pInventoryWnd,"InvSlot11","leftmouseup",Shiftkey);
if(!CursorEmpty()) pInvSlotMgr->MoveItem(NUM_INV_SLOTS,InvSlot,1,1);
}
}
}
// fire ranged attack if NPC on Target still in range and preserve the range slot.
do_ranged(SpawnMe(),"");
if(crI) if(rKind!=crI) if(OkayToEquip()) Equip(crI,inv_range);
}
}
PLUGIN_API VOID Override(PSPAWNINFO pChar, PCHAR Cmd) {
Announce(SHOW_OVERRIDE,Cmd,PLUGIN_NAME);
AttackOFF();
if(AutoFire) {
AutoFire=false;
EzCommand("/autofire");
}
PetBACK();
StickReset();
OtherReset();
}
PLUGIN_API VOID Melee(PSPAWNINFO pChar, PCHAR Cmd) {
char Tmp[MAX_STRING]; char Var[MAX_STRING]; char Set[MAX_STRING]; BYTE Parm=1; bool Help=true;
Liste::iterator c; Liste::iterator ec=CmdListe.end();
do {
GetArg(Tmp,Cmd,Parm++); _strlwr(Tmp);
GetArg(Var,Tmp,1,FALSE,FALSE,FALSE,'=');
GetArg(Set,Tmp,2,FALSE,FALSE,FALSE,'=');
if(Var[0]) {
c=CmdListe.find(Var);
if(ec!=c) {
(*c).second.Setup(Set);
(*c).second.Write();
Help=false;
} else if(!Set[0] && (!stricmp(Var,"on") || !stricmp(Var,"off"))) {
if(ec!=(c=CmdListe.find("plugin"))) (*c).second.Setup(Var);
Help=false;
} else if(!Set[0] && (!stricmp(Var,"reload") || !stricmp(Var,"load"))) {
WriteChatf("%s::Loading...",PLUGIN_NAME);
Configure();
Help=false;
} else if(!Set[0] && !stricmp(Var,"save")) {
WriteChatf("%s::Saving...",PLUGIN_NAME);
Exporting();
Help=false;
} else if(!Set[0] && !stricmp(Var,"key")) {
char buffer[MAX_STRING]; KeyCombo combo;
DescribeKeyCombo(pKeypressHandler->NormalKey[FindMappableCommand("AUTOPRIM")],buffer);
WriteChatf("%s::\ayATTACK\ax binded to [\ay%s\ax]",PLUGIN_NAME,buffer);
GetMQ2KeyBind("MELEE",false,combo);
DescribeKeyCombo(combo,buffer);
WriteChatf("%s::\ayMELEE\ax binded to [\ay%s\ax]",PLUGIN_NAME,buffer);
GetMQ2KeyBind("RANGE",false,combo);
DescribeKeyCombo(combo,buffer);
WriteChatf("%s::\ayRANGE\ax binded to [\ay%s\ax]",PLUGIN_NAME,buffer);
Help=false;
} else if(!Set[0] && !stricmp(Var,"reset")) {
Override(NULL,"%s::Resetting...");
Help=false;
} else {
WriteChatf("%s::Unsupported Argument <\ar%s\ax>",PLUGIN_NAME,Var);
break;
}
}
} while(strlen(Tmp));
if(Help) MeleeHelp();
}
PLUGIN_API VOID KillThis(PSPAWNINFO pChar, PCHAR Cmd) {
if(doSKILL && pTarget && !TargetID(MeleeTarg) && TargetType(NPC_TYPE) && InGame()) {
if(IsFeigning()) EzCommand("/stand");
StickReset();
OtherReset();
AggroReset();
MeleeTarg=((PSPAWNINFO)pTarget)->SpawnID;
strcpy(MeleeName,((PSPAWNINFO)pTarget)->DisplayedName);
MeleeSize=strlen(MeleeName)+1;
MeleeType=SpawnMask((PSPAWNINFO)pTarget);
onEVENT|=0x0008;
Announce(SHOW_ATTACKING,"%s::Attacking [\ay%s\ax].",PLUGIN_NAME,MeleeName);
}
}
PLUGIN_API VOID EnrageON(PSPAWNINFO pChar, PCHAR Cmd) {
if(long val=atol(Cmd)) if(val!=MeleeTarg) return;
if(doSKILL && doENRAGE && MeleeTarg && InGame()) {
PSPAWNINFO KillTarg=GetSpawnID(MeleeTarg);
if(!(onEVENT&0x0001)) {
if(!(onEVENT&0x0002)) PetBACK();
onEVENT|=0x0001;
Announce(SHOW_ENRAGING,"MQ2Melee::\arENRAGE\ax detected, taking action!");
}
if(*EQADDR_ATTACK && onEVENT&0x0003 && SpawnType(KillTarg,NPC_TYPE)) {
double Back=fabs(AngularDistance(KillTarg->Heading,SpawnMe()->Heading));
double View=fabs(AngularHeading(SpawnMe(),KillTarg));
if(Back > 92 || View > 60 || onEVENT&0x0002) {
onEVENT|=0x0008;
AttackOFF();
}
}
}
}
PLUGIN_API VOID EnrageOFF(PSPAWNINFO pChar, PCHAR Cmd) {
if(long val=atol(Cmd)) if(val!=MeleeTarg) return;
if(doSKILL && doENRAGE && MeleeTarg && onEVENT&0x0001 && InGame()) {
onEVENT&=0xFFFE;
if(TargetID(PetTarget)) PetATTK();
Announce(SHOW_ENRAGING,"MQ2Melee:: \agENRAGE\ax ended, taking action!");
}
}
PLUGIN_API VOID InfuriateON(PSPAWNINFO pChar, PCHAR Cmd) {
if(long val=atol(Cmd)) if(val!=MeleeTarg) return;
if(doSKILL && doINFURIATE && MeleeTarg && InGame()) {
if(!(onEVENT&0x0002)) {
if(!(onEVENT&0x0001)) PetBACK();
onEVENT|=0x0002;
Announce(SHOW_ENRAGING,"MQ2Melee::\arINFURIATE\ax detected, taking action!");
}
if(*EQADDR_ATTACK) {
AttackOFF();
onEVENT|=0x0008;
}
}
}
PLUGIN_API VOID InfuriateOFF(PSPAWNINFO pChar, PCHAR Cmd) {
if(long val=atol(Cmd)) if(val!=MeleeTarg) return;
if(doSKILL && doINFURIATE && MeleeTarg && onEVENT&0x0002 && InGame()) {
onEVENT&=0xFFFD;
if(TargetID(PetTarget)) PetATTK();
Announce(SHOW_ENRAGING,"MQ2Melee:\agINFURIATE\ax ended, taking action!");
}
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
void DowntimeHandle() {
if(doSENSETRAP && idSENSETRAP.Ready(ifSENSETRAP)) idSENSETRAP.Press();
if(!MeleeTarg && (DWORD)clock()>TimerAttk && Immobile) {
if(doDOWNFLAG[doDOWN] && DOWNSHIT[doDOWN].size()) EzCommand((PCHAR)DOWNSHIT[doDOWN].c_str());
for(long x=1; x<8; x++) {
long n=(x+doDOWN)&7;
if(doDOWNFLAG[n]) {
doDOWN=n;
break;
}
}
if(doFORAGE && idFORAGE.Ready(ifFORAGE)) idFORAGE.Press();
else if(doSNEAK && !IsSneaking() && idSNEAK.Ready(ifSNEAK)) idSNEAK.Press();
else if(doHIDE && !IsInvisible() && idHIDE.Ready(ifHIDE)) idHIDE.Press();
}
}
void MeleeHandle() {
// check opened windows that wont let us perform any melee actions.
if(!BardClass && WinState((CXWnd*)pCastingWnd)) return;
if(WinState((CXWnd*)pSpellBookWnd)) return;
if(WinState((CXWnd*)pLootWnd)) return;
if(WinState((CXWnd*)pBankWnd)) return;
if(WinState((CXWnd*)pMerchantWnd)) return;
if(WinState((CXWnd*)pTradeWnd)) return;
if(WinState((CXWnd*)pGiveWnd)) return;
Silenced=false;
// check detrimental buff that wont let ya perform melee actions.
for(int b=0; b<BuffMax; b++) {
long SpellID=GetCharInfo2()->Buff.SpellID;
if(SpellID<1) continue;
if(PSPELL spell=GetSpellByID(SpellID))
for(int a=0; a<12; a++) switch(spell->Attrib[a]) {
case 22: return; // charmed
case 23: return; // feared
case 31: return; // mesmerized
case 40: return; // invulnerable
case 96: Silenced=true; // silenced
}
}
// check detrimental song that wont let ya perform melee actions.
for(int s=0; s<SongMax; s++) {
long SpellID=GetCharInfo2()->ShortBuff.SpellID;
if(SpellID<1) continue;
if(PSPELL spell=GetSpellByID(SpellID))
for(int a=0; a<12; a++) switch(spell->Attrib[a]) {
case 22: return; // charmed
case 23: return; // feared
case 31: return; // mesmerized
case 40: return; // invulnerable
case 96: Silenced=true; // silenced
}
}
// check our health and perform some healing action if we can
if((Health=GetCurHPS()*100/GetMaxHPS())<100) {
Ability *UseThis=NULL;
if(doMEND && Health<=doMEND && idMEND.Ready(ifMEND)) UseThis=&idMEND;
else if(doLAYHAND && Health<=doLAYHAND && idLAYHAND.Ready(ifLAYHAND)) UseThis=&idLAYHAND;
else if(doPOTHEALFAST && Health<=doPOTHEALFAST && idPOTHEALFAST.Ready(ifPOTHEALFAST)) UseThis=&idPOTHEALFAST;
else if(doPOTHEALOVER && Health<=doPOTHEALOVER && idPOTHEALOVER.Ready(ifPOTHEALOVER)) UseThis=&idPOTHEALOVER;
if(UseThis) {
if(UseThis->ID == idLAYHAND.ID) {
PSPAWNINFO TargetSave=pTarget?(PSPAWNINFO)pTarget:NULL;
*(PSPAWNINFO*)ppTarget=SpawnMe();
idLAYHAND.Press();
*(PSPAWNINFO*)ppTarget=TargetSave;
} else UseThis->Press();
}
}
// check if we are stunned, if so we can't perform any melee actions
if(IsStunned()) return;
// check if we still have a killing target or we acquiring a new one
if((pTarget && TargetType(NPC_TYPE)) && (*EQADDR_ATTACK || onEVENT&0x8000)) {
if(!MeleeTarg) KillThis(NULL,"");
else if(!TargetID(MeleeTarg)) {
Override(NULL,"%s::\arTARGET SWITCH\ax taking actions.");
return;
}
TimerAttk=(DWORD)clock()+delay*12;
}
if(MeleeTarg) if(PSPAWNINFO Tar=GetSpawnID(MeleeTarg)) {
if(!MeleeLife || Tar->HPCurrent<MeleeLife) TimerLife=(DWORD)clock()+1500;
MeleeLife=Tar->HPCurrent;
}
// check if we should standup from an interrupted feign death
if(BrokenFD && (DWORD)clock()>BrokenFD) {
BrokenFD=false;
if(IsFeigning()) {
Announce(SHOW_FEIGN,"%s::\arFAILED FEIGN DEATH\ax taking action!",PLUGIN_NAME);
EzCommand("/stand");
return;
}
}
// check it's a good time to perform some downtime actions?
if(!IsCasting()) DowntimeHandle();
// check it's a good time to drop combat?
Ability *FeignDeath=NULL;
if(idFEIGN[0].Ready("")) FeignDeath=&idFEIGN[0];
else if(idFEIGN[1].Ready("")) FeignDeath=&idFEIGN[1];
Health=GetCurHPS()*100/GetMaxHPS();
if(!doAGGRO && !(onEVENT&0x0FF0) && !IsFeigning() && !IsInvisible()) {
bool fTime=(doFEIGNDEATH && Health<=doFEIGNDEATH && FeignDeath);
bool eTime=(doESCAPE && Health<=doESCAPE && idESCAPE.Ready(""));
bool bTime=(doBACKOFF && Health<=doBACKOFF);
if(fTime || eTime || bTime) {
if(*EQADDR_ATTACK) {
onEVENT|=0x0008;
AttackOFF();
} else {
if(fTime) onEVENT|=0x0040;
else if(eTime) onEVENT|=0x0020;
else if(bTime) onEVENT|=0x0010;
if(onEVENT&0x0020) idESCAPE.Press();
else if(onEVENT&0x0040) FeignDeath->Press();
}
return;
}
}
// check it's a good time to resume combat?
if((IsFeigning() || IsInvisible() || onEVENT&0x0FF0) && !(onEVENT&0x4000)) {
if(!TimerBack) TimerBack=(DWORD)clock()+delay;
else if((DWORD)clock()>TimerBack && (doAGGRO || (onEVENT&0x0FF0 && Health>doRESUME))) {
if((IsInvisible() || onEVENT&0x0220) && (!IsInvisible() || !(onEVENT&0x0020))) onEVENT&=0xFDDF;
if((IsFeigning() || onEVENT&0x0440) && (!IsFeigning() || (IsFeigning() && doSTAND))) {
onEVENT&=0xFBBF;
EzCommand("/stand");
StickReset();
return;
}
onEVENT&=0xF99F;
TimerBack=false;
}
}
// time to handle dummy pet, check mending, check we have target in range, etc...
if(doPETASSIST && MeleeTarg ) {
PSPAWNINFO Pet=SpawnPet();
PSPAWNINFO Tar=GetSpawnID(MeleeTarg);
if( Pet && Tar ) {
if( doPETMEND && Pet->HPCurrent<=doPETMEND && idPETMEND.Ready("") ) idPETMEND.Press();
PetInDist=( !doPETRANGE || InRange(Pet,Tar,(FLOAT)doPETRANGE) );
if( !PetOnWait && PetInDist ) PetOnWait=(DWORD)clock()+doPETDELAY*1000;
if( PetOnWait && (DWORD)clock()>PetOnWait && PetInDist ) {
if( (DWORD)clock()>TimerLife || !IdlingArray[Tar->Animation & 0xFF] )
if( (DWORD)clock()>PetOnAttk ) PetATTK();
}
}
}
// hold on?
if(!MeleeTarg || !TargetID(MeleeTarg) || !IsStanding() || onEVENT&0x0FF2) {
if(*EQADDR_ATTACK) AttackOFF();
return;
}
// target is in range? could we engage and kill it?
if((MeleeDist=DistanceToSpawn(SpawnMe(),(PSPAWNINFO)pTarget))>250) {
Override(NULL,"");
return;
}
MeleeSpeed=fabs(FindSpeed((PSPAWNINFO)pTarget));
MeleeBack=fabs(AngularDistance(((PSPAWNINFO)pTarget)->Heading,SpawnMe()->Heading));
MeleeView=fabs(AngularHeading(SpawnMe(),(PSPAWNINFO)pTarget));
MeleeFlee=(MeleeFlee || (MeleeLife<=85 && MeleeSpeed>25.0f && IsMobFleeing(SpawnMe(),(PSPAWNINFO)pTarget)));
MeleeKill=((PSPAWNINFO)pTarget)->AvatarHeight+12.0f;
Sticking=Evaluate("${If[${Stick.Active},1,0]}");
// are we discing? if so time to promote some actions?
long disc=Discipline();
if(disc && !(onEVENT&0x7007)) switch(disc) {
case d_ashenhand: // Ashenhand Discipline?
if(doMELEE && MeleeDist<MeleeKill && idEAGLESTRIKE.Ready("")) idEAGLESTRIKE.Press(); break;
case d_silentfist: // Silentfist Discipline?
if(doMELEE && MeleeDist<MeleeKill && idDRAGONPUNCH.Ready("")) idDRAGONPUNCH.Press(); break;
case d_thunderkick: // Thunderkick Discipline?
case d_heelofkanji: // Heel of Kanji?
if(doMELEE && MeleeDist<MeleeKill && idFLYINGKICK.Ready("")) idFLYINGKICK.Press(); break;
case d_assassin1:
case d_assassin2:
case d_assassin3:
if(doMELEE && MeleeDist<MeleeKill && MeleeView<60 && MeleeBack<doSTAB && idBACKSTAB.Ready("") && StabCheck()) StabPress(); break;
}
// scripted rogue sequence striking/assasination codes
if(doASSASINATE && doBACKSTAB && doMELEE && onSTICK>0 && !SwingHits && !TakenHits && MeleeSpeed<2.0f && !*EQADDR_ATTACK && StabCheck()) {
if(!Moving && Immobile) {
if(!IsSneaking() && idSNEAK.Ready("")) idSNEAK.Press();
if(!IsInvisible() && idHIDE.Ready("")) idHIDE.Press();
if(IsSneaking() && TimeSince(SilentTimer)>1000 && IsInvisible() && TimeSince(HiddenTimer)>1000) {
if(doSTAB>191) sprintf(Reserved,"%2.2f id %d !front" ,MeleeKill-3.0f,MeleeTarg);
else sprintf(Reserved,"%2.2f id %d behindonce",MeleeKill-3.0f,MeleeTarg);
if(!Sticking && strcmp(Reserved,StickArg)) {
Stick(Reserved);
return;
}
if(MeleeDist>MeleeKill || MeleeView>60 || MeleeBack>doSTAB) SwingHits++;
else if(idBACKSTAB.Ready("") && TimeSince(HiddenTimer)>3000) {
if(Sticking) ("/stick off");
if(doSTRIKE && idSTRIKE.Ready(ifSTRIKE)) idSTRIKE.Press();
else StabPress();
}
}
}
if(Sticking && (SwingHits || TakenHits || !IsSneaking() || !IsInvisible())) Stick("");
return;
}
// jolting times!
if(doJOLT && !doAGGRO && SwingHits>doJOLT && idJOLT.Ready(ifJOLT)) {
idJOLT.Press();
SwingHits=1;
}
// handle melee
if(doMELEE && !(onEVENT&0x8000)) {
if(onEVENT&0x0008 && !(onEVENT&0xF007) && !*EQADDR_ATTACK) AttackON();
if(onSTICK) {
if(onSTICK > 0) {
if(!TimerStik) if(!doSTICKRANGE || MeleeDist<doSTICKRANGE) TimerStik=(DWORD)clock()+doSTICKDELAY*1000;
if(Immobile && !Sticking && (!doSTICKDELAY || (DWORD)clock()>TimerStik) && (!doSTICKRANGE || MeleeDist<doSTICKRANGE)) onSTICK=-1;
}
if(onSTICK<0) {
if(doSTICKMODE) {
strcpy(Reserved,StickCMD.c_str());
ParseMacroData(Reserved);
} else {
long type=Aggroed(MeleeTarg);
bool swim=(SpawnMe()->UnderWater==5);
bool stab=(type<1 && doBACKSTAB && doSTAB<192);
bool tank=(type>0 || (!IsInvisible() && (doAGGRO || !GetCharInfo()->GroupLeader[0])));
double dist=MeleeKill-3.0f-(MeleeFlee*3.0f);
sprintf(Reserved,"%2.2f id %d%s%s",dist,MeleeTarg,MeleeFlee?"":tank?" moveback":!stab?" !front":" behind",swim?" uw":"");
}
if(strcmp(Reserved,StickArg)) Stick(Reserved);
}
}
// not behind enraged/infuriated target?
if(onEVENT&0x0003 && *EQADDR_ATTACK) {
if(MeleeBack > 92 || onEVENT&0x0002) {
if(MeleeBack > 92) Announce(SHOW_ENRAGING,"%s::\arNOT BEHIND\ax enraged target, taking action!",PLUGIN_NAME);
onEVENT|=0x0008;
AttackOFF();
return;
}
}
// check target is in melee range?
if(MeleeDist<MeleeKill) {
// attack is off, good time for stealing/begging or evading?
if(!*EQADDR_ATTACK) {
onEVENT&=0xBFFF;
if(!MeleeFlee) {
if(doPICKPOCKET && idPICKPOCKET.Ready(ifPICKPOCKET)) {
idPICKPOCKET.Press();
onEVENT|=0x1008;
} else if(doBEGGING && !IsInvisible() && idBEGGING.Ready(ifBEGGING)) {
idBEGGING.Press();
onEVENT|=0x2008;
}
if(doEVADE && !doAGGRO && Immobile && !IsInvisible() && idHIDE.Ready(ifEVADE)) {
idHIDE.Press();
onEVENT|=0x0208;
} else if(doFALLS && !doAGGRO && FeignDeath->Ready(ifFALLS)) {
FeignDeath->Press();
onEVENT|=0x0408;
}
}
if(onEVENT&0x0001 && !(onEVENT&0xFFF6) && MeleeBack<92) {
Announce(SHOW_ENRAGING,"%s::\agBEHIND\ax TARGET kicking attack ON!!!",PLUGIN_NAME);
onEVENT&=0xFFF6; AttackON(); onEVENT|=0x0009;
}
// attack is on so lets do some dps?
} else {
if(doBACKSTAB && MeleeBack<doSTAB && MeleeView<60 && idBACKSTAB.Ready(ifBACKSTAB) && StabCheck()) StabPress();
if(doFLYINGKICK && idFLYINGKICK.Ready(ifFLYINGKICK)) idFLYINGKICK.Press();
if(doDRAGONPUNCH && idDRAGONPUNCH.Ready(ifDRAGONPUNCH)) idDRAGONPUNCH.Press();
if(doEAGLESTRIKE && idEAGLESTRIKE.Ready(ifEAGLESTRIKE)) idEAGLESTRIKE.Press();
if(doTIGERCLAW && idTIGERCLAW.Ready(ifTIGERCLAW)) idTIGERCLAW.Press();
if(doROUNDKICK && idROUNDKICK.Ready(ifROUNDKICK)) idROUNDKICK.Press();
if(doBASH && idBASH.Ready(ifBASH) && BashCheck()) BashPress();
if(doSLAM && idSLAM.Ready(ifSLAM)) idSLAM.Press();
if(doFRENZY && idFRENZY.Ready(ifFRENZY)) idFRENZY.Press();
if(doKICK && idKICK.Ready(ifKICK)) idKICK.Press();
if(!disc && Immobile && !IsInvisible() && !MeleeFlee) {
if(doPICKPOCKET && idPICKPOCKET.Ready(ifPICKPOCKET)) onEVENT|=0x4008;
if(doBEGGING && idBEGGING.Ready(ifBEGGING)) onEVENT|=0x4008;
if(doFALLS && !doAGGRO && FeignDeath->Ready(ifFALLS)) onEVENT|=0x4008;
if(doEVADE && !(doAGGRO || !IsGrouped()) && idHIDE.Ready(ifEVADE)) onEVENT|=0x4008;
if(onEVENT&0x4000 && *EQADDR_ATTACK) AttackOFF();
}
if(doDISARM && idDISARM.Ready(ifDISARM)) idDISARM.Press();
}
if(doINTIMIDATION && idINTIMIDATION.Ready(ifINTIMIDATION)) idINTIMIDATION.Press();
if(doTAUNT && doAGGRO && idTAUNT.Ready(ifTAUNT)) idTAUNT.Press();
}
if(MeleeFlee) SneakOFF();
if(onEVENT&0x3000) onEVENT&=0xCFFF;
}
// handle ranged?
if(doRANGE || onEVENT&0x8000) {
// should we face target? not moving, stopped >2sec, facing>2sec and not sticking?
if(doFACING && Immobile && (DWORD)clock()>TimerFace && !Sticking) {
if(MeleeView>30) Face(SpawnMe(),"");
TimerFace=(DWORD)clock()+delay*8;
}
// are we in good ranged for ranged?
if(MeleeDist<(doRANGE?doRANGE:250) && MeleeDist>35 && MeleeDist>MeleeKill+20) {
if(!AutoFire && gbRangedAttackReady) ThrowIT(NULL,"");
if(*EQADDR_ATTACK) {
if(Sticking) Stick("");
onEVENT|=0x8000;
AttackOFF();
Announce(SHOW_SWITCHING,"%s::Switching [\ayRange\ax].",PLUGIN_NAME);
}
// target too close? or too far?
} else if(!*EQADDR_ATTACK) {
if(AutoFire) {
EzCommand("/autofire");
AutoFire=false;
}
if(Immobile && onEVENT&0x8000) {
onEVENT&=0x7FF7;
if(doMELEE) {
StickReset();
onEVENT|=0x0008;
AttackON();
Announce(SHOW_SWITCHING,"%s::Switching [\ayMelee\ax].",PLUGIN_NAME);
}
}
}
}
// time to handle spell casting?
if(!TargetID(MeleeTarg) || MeleeDist>200) return;
long MyEndu=GetCharInfo2()->Endurance*100/GetMaxEndurance();
// should we stun that target?
if(doSTUNNING && MeleeLife<=doSTUNNING) {
Ability *UseThis=NULL;
if(idSTUN[0].Ready(ifSTUNNING)) UseThis=&idSTUN[0];
else if(idSTUN[1].Ready(ifSTUNNING)) UseThis=&idSTUN[1];
if(UseThis) {
Announce(SHOW_STUNNING,"%s::Stunning [\ay%s\ax].",PLUGIN_NAME,MeleeName);
UseThis->Press();
}
}
// are we grouped?
if(IsGrouped()) {
// Time to build and maintain aggro?
if(doAGGRO) {
LONG HaveAggro=Aggroed(MeleeTarg);
// should we challenge for to maintain aggro over time?
if(doCHALLENGEFOR && onCHALLENGEFOR && HaveAggro==1 && idCHALLENGEFOR.Ready(ifCHALLENGEFOR)) {
Announce(SHOW_PROVOKING,"%s::Challenging [\ay%s\ax].",PLUGIN_NAME,MeleeName);
idCHALLENGEFOR.Press();
onCHALLENGEFOR--;
}
// should we provoke at least once and/or when aggro is lost?
if(onBELOW && MeleeLife>doPROVOKEEND && MeleeDist<100 && (HaveAggro<1 || (doPROVOKEONCE && onBELOW==doPROVOKEMAX))) {
Ability *UseThis=NULL;
if(idPROVOKE[0].Ready(ifPROVOKE)) UseThis=&idPROVOKE[0];
else if(idPROVOKE[1].Ready(ifPROVOKE)) UseThis=&idPROVOKE[1];
if(UseThis) {
Announce(SHOW_PROVOKING,"%s::Provoking [\ay%s\ax].",PLUGIN_NAME,MeleeName);
UseThis->Press();
onBELOW--;
}
}
}
// should we use short duration melee buff?
if(GetCharInfo2()->Endurance>200) {
if(doCOMMANDING && MyEndu>doCOMMANDING && idCOMMANDING.Ready(ifCOMMANDING)) idCOMMANDING.Press();
if(doFISTSOFWU && MyEndu>doFISTSOFWU && idFISTSOFWU.Ready(ifFISTSOFWU)) idFISTSOFWU.Press();
if(doCRYHAVOC && MyEndu>doCRYHAVOC && idCRYHAVOC.Ready(ifCRYHAVOC) && disc!=d_cleaverage && disc!=d_cleaveanger) idCRYHAVOC.Press();
if(doTHIEFEYE && MyEndu>doTHIEFEYE && idTHIEFEYE.Ready(ifTHIEFEYE)) idTHIEFEYE.Press();
}
}
// should we use annihilator's/non-existant giantslayer's/destroyer's/rage volley?
if(doRAGEVOLLEY && MyEndu>doRAGEVOLLEY && MeleeDist<175 && idRAGEVOLLEY.Ready(ifRAGEVOLLEY)) idRAGEVOLLEY.Press();
// is target close enough for those?
if(MeleeDist < 50) {
if(doRAKE && MyEndu>doRAKE && idRAKE.Ready(ifRAKE)) idRAKE.Press();
if(doFERALSWIPE && idFERALSWIPE.Ready(ifFERALSWIPE)) idFERALSWIPE.Press();
if(doLEOPARDCLAW && MyEndu>doLEOPARDCLAW && idLEOPARDCLAW.Ready(ifLEOPARDCLAW)) idLEOPARDCLAW.Press();
if(doTHROWSTONE && MyEndu>doTHROWSTONE && idTHROWSTONE.Ready(ifTHROWSTONE)) idTHROWSTONE.Press();
if(doCALLCHALLENGE && idCALLCHALLENGE.Ready(ifCALLCHALLENGE)) idCALLCHALLENGE.Press();
if(doTWISTEDSHANK && idTWISTEDSHANK.Ready(ifTWISTEDSHANK)) idTWISTEDSHANK.Press();
}
// time to handle holy shit?
if(doHOLYFLAG[doHOLY] && HOLYSHIT[doHOLY].size()) EzCommand((PCHAR)HOLYSHIT[doHOLY].c_str());
for(long x=1; x<8; x++) {
long n=(x+doHOLY)&7;
if(doHOLYFLAG[n]) {
doHOLY=n;
break;
}
}
}
void KeyMelee(PCHAR NAME, BOOL Down) {
if(Down && pTarget) {
if(!doSKILL) EzCommand("/keypress AUTOPRIM");
else if(!MeleeTarg) KillThis(NULL,"");
else Override(NULL,"%s::\arOVERRIDE\ax taking actions!");
}
}
void KeyRange(PCHAR NAME, BOOL Down) {
if(Down && pTarget) {
if(!doSKILL) EzCommand("/keypress RANGED");
else ThrowIT(NULL,"");
}
}
void Bindding(bool BindMode) {
if(BindMode) {
if(!Binded) {
KeyCombo MeleeCombo, RangeCombo;
RemoveMQ2KeyBind("MELEE"); AddMQ2KeyBind("MELEE",KeyMelee); ParseKeyCombo(MeleeKey,MeleeCombo); SetMQ2KeyBind("MELEE",false,MeleeCombo);
RemoveMQ2KeyBind("RANGE"); AddMQ2KeyBind("RANGE",KeyRange); ParseKeyCombo(RangeKey,RangeCombo); SetMQ2KeyBind("RANGE",false,RangeCombo);
Binded=true;
}
} else if(Binded) {
RemoveMQ2KeyBind("MELEE");
RemoveMQ2KeyBind("RANGE");
Binded=false;
}
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
void __stdcall AUTOFIREOFF(unsigned int ID, void *pData, PBLECHVALUE pValues) {
AutoFire=false;
if(AutoFire) KeyMelee("",true);
}
void __stdcall AUTOFIREON(unsigned int ID, void *pData, PBLECHVALUE pValues) {
if(pTarget && TargetType(NPC_TYPE) && InGame()) AutoFire=true;
}
void __stdcall CASTING(unsigned int ID, void *pData, PBLECHVALUE pValues) {
if(doSKILL && MeleeTarg && !strnicmp(pValues->Value,MeleeName,MeleeSize)) MeleeCast=(DWORD)clock();
}
void __stdcall ENRAGEON(unsigned int ID, void *pData, PBLECHVALUE pValues) {
if(MeleeTarg && !strnicmp(pValues->Value,MeleeName,MeleeSize)) EnrageON(NULL,"");
}
void __stdcall ENRAGEOFF(unsigned int ID, void *pData, PBLECHVALUE pValues) {
if(MeleeTarg && !strnicmp(pValues->Value,MeleeName,MeleeSize)) EnrageOFF(NULL,"");
}
void __stdcall INFURIATEON(unsigned int ID, void *pData, PBLECHVALUE pValues) {
if(MeleeTarg && !strnicmp(pValues->Value,MeleeName,MeleeSize)) InfuriateON(NULL,"");
}
void __stdcall INFURIATEOFF(unsigned int ID, void *pData, PBLECHVALUE pValues) {
if(MeleeTarg && !strnicmp(pValues->Value,MeleeName,MeleeSize)) InfuriateOFF(NULL,"");
}
void __stdcall PETATTK(unsigned int ID, void *pData, PBLECHVALUE pValues) {
PetSEEN();
}
void __stdcall PETBACK(unsigned int ID, void *pData, PBLECHVALUE pValues) {
if(HaveHold) {
Announce(SHOW_CONTROL,"%s::Command [\ay%s\ax].",PLUGIN_NAME,"/pet hold");
EzCommand("/pet hold");
if(PetOnAttk) PetOnAttk=(DWORD)clock()+1000;
PetOnHold=true;
}
}
void __stdcall PETHOLD(unsigned int ID, void *pData, PBLECHVALUE pValues) {
PetOnHold=true;
}
void __stdcall FALLEN(unsigned int ID, void *pData, PBLECHVALUE pValues) {
if(!doSKILL || ((long)pData && strnicmp(pValues->Value,GetCharInfo()->Name,strlen(GetCharInfo()->Name)+1))) return;
Announce(SHOW_FEIGN,"%s::\arFAILED FEIGN DEATH\ax taking action!",PLUGIN_NAME);
EzCommand("/stand");
}
void __stdcall BROKEN(unsigned int ID, void *pData, PBLECHVALUE pValues) {
if(doSKILL) BrokenFD=(DWORD)clock()+1;
}
void __stdcall RESUME(unsigned int ID, void *pData, PBLECHVALUE pValues) {
if(doSKILL) BrokenFD=0;
}
void __stdcall SNEAKON(unsigned int ID, void *pData, PBLECHVALUE pValues) {
SilentTimer=(DWORD)clock();
}
void __stdcall SNEAKOFF(unsigned int ID, void *pData, PBLECHVALUE pValues) {
SilentTimer=0;
}
void __stdcall HIDEON(unsigned int ID, void *pData, PBLECHVALUE pValues) {
HiddenTimer=(DWORD)clock();
}
void __stdcall HIDEOFF(unsigned int ID, void *pData, PBLECHVALUE pValues) {
HiddenTimer=0;
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
PLUGIN_API VOID InitializePlugin() {
NPC_TYPE=GetPrivateProfileInt("Settings","SpawnType",0x000A,INIFileName);
GetPrivateProfileString("Settings","MeleeKeys","z",MeleeKey,sizeof(MeleeKey),INIFileName);
GetPrivateProfileString("Settings","RangeKeys","x",RangeKey,sizeof(RangeKey),INIFileName);
CmdListe.clear();
MapInsert(&CmdListe,Option(pAGGRO[0],pAGGRO[1],pAGGRO[2],pAGGRO[3],AggroReset,&doAGGRO));
MapInsert(&CmdListe,Option(pAGGRP[0],pAGGRP[1],pAGGRP[2],pAGGRP[3],NULL ,&elAGGROPRI));
MapInsert(&CmdListe,Option(pAGGRS[0],pAGGRS[1],pAGGRS[2],pAGGRS[3],NULL ,&elAGGROSEC));
MapInsert(&CmdListe,Option(pARROW[0],pARROW[1],pARROW[2],pARROW[3],NULL ,&elARROWS));
MapInsert(&CmdListe,Option(pASSAS[0],pASSAS[1],pASSAS[2],pASSAS[3],NULL ,&doASSASINATE));
MapInsert(&CmdListe,Option(pBKOFF[0],pBKOFF[1],pBKOFF[2],pBKOFF[3],NULL ,&doBACKOFF));
MapInsert(&CmdListe,Option(pBSTAB[0],pBSTAB[1],pBSTAB[2],pBSTAB[3],NULL ,&doBACKSTAB));
MapInsert(&CmdListe,Option(pBASHS[0],pBASHS[1],pBASHS[2],pBASHS[3],NULL ,&doBASH));
MapInsert(&CmdListe,Option(pBGING[0],pBGING[1],pBGING[2],pBGING[3],NULL ,&doBEGGING));
MapInsert(&CmdListe,Option(pCALLC[0],pCALLC[1],pCALLC[2],pCALLC[3],NULL ,&doCALLCHALLENGE));
MapInsert(&CmdListe,Option(pCHFOR[0],pCHFOR[1],pCHFOR[2],pCHFOR[3],NULL ,&doCHALLENGEFOR));
MapInsert(&CmdListe,Option(pCOMMG[0],pCOMMG[1],pCOMMG[2],pCOMMG[3],NULL ,&doCOMMANDING));
MapInsert(&CmdListe,Option(pCRYHC[0],pCRYHC[1],pCRYHC[2],pCRYHC[3],NULL ,&doCRYHAVOC));
MapInsert(&CmdListe,Option(pDISRM[0],pDISRM[1],pDISRM[2],pDISRM[3],NULL ,&doDISARM));
MapInsert(&CmdListe,Option(pDWNF0[0],pDWNF0[1],pDWNF0[2],pDWNF0[3],NULL ,&doDOWNFLAG[0]));
MapInsert(&CmdListe,Option(pDWNF1[0],pDWNF1[1],pDWNF1[2],pDWNF1[3],NULL ,&doDOWNFLAG[1]));
MapInsert(&CmdListe,Option(pDWNF2[0],pDWNF2[1],pDWNF2[2],pDWNF2[3],NULL ,&doDOWNFLAG[2]));
MapInsert(&CmdListe,Option(pDWNF3[0],pDWNF3[1],pDWNF3[2],pDWNF3[3],NULL ,&doDOWNFLAG[3]));
MapInsert(&CmdListe,Option(pDWNF4[0],pDWNF4[1],pDWNF4[2],pDWNF4[3],NULL ,&doDOWNFLAG[4]));
MapInsert(&CmdListe,Option(pDWNF5[0],pDWNF5[1],pDWNF5[2],pDWNF5[3],NULL ,&doDOWNFLAG[5]));
MapInsert(&CmdListe,Option(pDWNF6[0],pDWNF6[1],pDWNF6[2],pDWNF6[3],NULL ,&doDOWNFLAG[6]));
MapInsert(&CmdListe,Option(pDWNF7[0],pDWNF7[1],pDWNF7[2],pDWNF7[3],NULL ,&doDOWNFLAG[7]));
MapInsert(&CmdListe,Option(pDRPNC[0],pDRPNC[1],pDRPNC[2],pDRPNC[3],NULL ,&doDRAGONPUNCH));
MapInsert(&CmdListe,Option(pEAGLE[0],pEAGLE[1],pEAGLE[2],pEAGLE[3],NULL ,&doEAGLESTRIKE));
MapInsert(&CmdListe,Option(pERAGE[0],pERAGE[1],pERAGE[2],pERAGE[3],NULL ,&doENRAGE));
MapInsert(&CmdListe,Option(pESCAP[0],pESCAP[1],pESCAP[2],pESCAP[3],NULL ,&doESCAPE));
MapInsert(&CmdListe,Option(pEVADE[0],pEVADE[1],pEVADE[2],pEVADE[3],NULL ,&doEVADE));
MapInsert(&CmdListe,Option(pFEIGN[0],pFEIGN[1],pFEIGN[2],pFEIGN[3],NULL ,&doFEIGNDEATH));
MapInsert(&CmdListe,Option(pFACES[0],pFACES[1],pFACES[2],pFACES[3],NULL ,&doFACING));
MapInsert(&CmdListe,Option(pFALLS[0],pFALLS[1],pFALLS[2],pFALLS[3],NULL ,&doFALLS));
MapInsert(&CmdListe,Option(pFERAL[0],pFERAL[1],pFERAL[2],pFERAL[3],NULL ,&doFERALSWIPE));
MapInsert(&CmdListe,Option(pFISTS[0],pFISTS[1],pFISTS[2],pFISTS[3],NULL ,&doFISTSOFWU));
MapInsert(&CmdListe,Option(pFLYKC[0],pFLYKC[1],pFLYKC[2],pFLYKC[3],NULL ,&doFLYINGKICK));
MapInsert(&CmdListe,Option(pFORAG[0],pFORAG[1],pFORAG[2],pFORAG[3],NULL ,&doFORAGE));
MapInsert(&CmdListe,Option(pFRENZ[0],pFRENZ[1],pFRENZ[2],pFRENZ[3],NULL ,&doFRENZY));
MapInsert(&CmdListe,Option(pHARMT[0],pHARMT[1],pHARMT[2],pHARMT[3],NULL ,&doHARMTOUCH));
MapInsert(&CmdListe,Option(pHIDES[0],pHIDES[1],pHIDES[2],pHIDES[3],NULL ,&doHIDE));
MapInsert(&CmdListe,Option(pHOLF0[0],pHOLF0[1],pHOLF0[2],pHOLF0[3],NULL ,&doHOLYFLAG[0]));
MapInsert(&CmdListe,Option(pHOLF1[0],pHOLF1[1],pHOLF1[2],pHOLF1[3],NULL ,&doHOLYFLAG[1]));
MapInsert(&CmdListe,Option(pHOLF2[0],pHOLF2[1],pHOLF2[2],pHOLF2[3],NULL ,&doHOLYFLAG[2]));
MapInsert(&CmdListe,Option(pHOLF3[0],pHOLF3[1],pHOLF3[2],pHOLF3[3],NULL ,&doHOLYFLAG[3]));
MapInsert(&CmdListe,Option(pHOLF4[0],pHOLF4[1],pHOLF4[2],pHOLF4[3],NULL ,&doHOLYFLAG[4]));
MapInsert(&CmdListe,Option(pHOLF5[0],pHOLF5[1],pHOLF5[2],pHOLF5[3],NULL ,&doHOLYFLAG[5]));
MapInsert(&CmdListe,Option(pHOLF6[0],pHOLF6[1],pHOLF6[2],pHOLF6[3],NULL ,&doHOLYFLAG[6]));
MapInsert(&CmdListe,Option(pHOLF7[0],pHOLF7[1],pHOLF7[2],pHOLF7[3],NULL ,&doHOLYFLAG[7]));
MapInsert(&CmdListe,Option(pINFUR[0],pINFUR[1],pINFUR[2],pINFUR[3],NULL ,&doINFURIATE));
MapInsert(&CmdListe,Option(pINTIM[0],pINTIM[1],pINTIM[2],pINTIM[3],NULL ,&doINTIMIDATION));
MapInsert(&CmdListe,Option(pJOLTS[0],pJOLTS[1],pJOLTS[2],pJOLTS[3],NULL ,&doJOLT));
MapInsert(&CmdListe,Option(pKICKS[0],pKICKS[1],pKICKS[2],pKICKS[3],NULL ,&doKICK));
MapInsert(&CmdListe,Option(pLHAND[0],pLHAND[1],pLHAND[2],pLHAND[3],NULL ,&doLAYHAND));
MapInsert(&CmdListe,Option(pLCLAW[0],pLCLAW[1],pLCLAW[2],pLCLAW[3],NULL ,&doLEOPARDCLAW));
MapInsert(&CmdListe,Option(pMELEE[0],pMELEE[1],pMELEE[2],pMELEE[3],NULL ,&doMELEE));
MapInsert(&CmdListe,Option(pMELEP[0],pMELEP[1],pMELEP[2],pMELEP[3],NULL ,&elMELEEPRI));
MapInsert(&CmdListe,Option(pMELES[0],pMELES[1],pMELES[2],pMELES[3],NULL ,&elMELEESEC));
MapInsert(&CmdListe,Option(pMENDS[0],pMENDS[1],pMENDS[2],pMENDS[3],NULL ,&doMEND));
MapInsert(&CmdListe,Option(pBOWID[0],pBOWID[1],pBOWID[2],pBOWID[3],NULL ,&elRANGED));
MapInsert(&CmdListe,Option(pPETAS[0],pPETAS[1],pPETAS[2],pPETAS[3],NULL ,&doPETASSIST));
MapInsert(&CmdListe,Option(pPETDE[0],pPETDE[1],pPETDE[2],pPETDE[3],NULL ,&doPETDELAY));
MapInsert(&CmdListe,Option(pPETRN[0],pPETRN[1],pPETRN[2],pPETRN[3],NULL ,&doPETRANGE));
MapInsert(&CmdListe,Option(pPETMN[0],pPETMN[1],pPETMN[2],pPETMN[3],NULL ,&doPETMEND));
MapInsert(&CmdListe,Option(pPICKP[0],pPICKP[1],pPICKP[2],pPICKP[3],NULL ,&doPICKPOCKET));
MapInsert(&CmdListe,Option(pPOKER[0],pPOKER[1],pPOKER[2],pPOKER[3],NULL ,&elPOKER));
MapInsert(&CmdListe,Option(pHFAST[0],pHFAST[1],pHFAST[2],pHFAST[3],NULL ,&doPOTHEALFAST));
MapInsert(&CmdListe,Option(pHOVER[0],pHOVER[1],pHOVER[2],pHOVER[3],NULL ,&doPOTHEALOVER));
MapInsert(&CmdListe,Option(pPRVKM[0],pPRVKM[1],pPRVKM[2],pPRVKM[3],AggroReset,&doPROVOKEMAX));
MapInsert(&CmdListe,Option(pPRVKE[0],pPRVKE[1],pPRVKE[2],pPRVKE[3],NULL ,&doPROVOKEEND));
MapInsert(&CmdListe,Option(pPRVKO[0],pPRVKO[1],pPRVKO[2],pPRVKO[3],NULL ,&doPROVOKEONCE));
MapInsert(&CmdListe,Option(pPRVK0[0],pPRVK0[1],pPRVK0[2],pPRVK0[3],NULL ,&idPROVOKE[0]));
MapInsert(&CmdListe,Option(pPRVK1[0],pPRVK1[1],pPRVK1[2],pPRVK1[3],NULL ,&idPROVOKE[1]));
MapInsert(&CmdListe,Option(pRAVOL[0],pRAVOL[1],pRAVOL[2],pRAVOL[3],NULL ,&doRAGEVOLLEY));
MapInsert(&CmdListe,Option(pRAKES[0],pRAKES[1],pRAKES[2],pRAKES[3],NULL ,&doRAKE));
MapInsert(&CmdListe,Option(pRANGE[0],pRANGE[1],pRANGE[2],pRANGE[3],RangeReset,&doRANGE));
MapInsert(&CmdListe,Option(pRESUM[0],pRESUM[1],pRESUM[2],pRESUM[3],NULL ,&doRESUME));
MapInsert(&CmdListe,Option(pRKICK[0],pRKICK[1],pRKICK[2],pRKICK[3],NULL ,&doROUNDKICK));
MapInsert(&CmdListe,Option(pSENSE[0],pSENSE[1],pSENSE[2],pSENSE[3],NULL ,&doSENSETRAP));
MapInsert(&CmdListe,Option(pPLUGS[0],pPLUGS[1],pPLUGS[2],pPLUGS[3],NULL ,&doSKILL));
MapInsert(&CmdListe,Option(pSLAMS[0],pSLAMS[1],pSLAMS[2],pSLAMS[3],NULL ,&doSLAM));
MapInsert(&CmdListe,Option(pSNEAK[0],pSNEAK[1],pSNEAK[2],pSNEAK[3],NULL ,&doSNEAK));
MapInsert(&CmdListe,Option(pSTAND[0],pSTAND[1],pSTAND[2],pSTAND[3],NULL ,&doSTAND));
MapInsert(&CmdListe,Option(pSTIKR[0],pSTIKR[1],pSTIKR[2],pSTIKR[3],StickReset,&doSTICKRANGE));
MapInsert(&CmdListe,Option(pSTIKD[0],pSTIKD[1],pSTIKD[2],pSTIKD[3],StickReset,&doSTICKDELAY));
MapInsert(&CmdListe,Option(pSTIKM[0],pSTIKM[1],pSTIKM[2],pSTIKM[3],NULL ,&doSTICKMODE));
MapInsert(&CmdListe,Option(pSTUNS[0],pSTUNS[1],pSTUNS[2],pSTUNS[3],NULL ,&doSTUNNING));
MapInsert(&CmdListe,Option(pSTUN0[0],pSTUN0[1],pSTUN0[2],pSTUN0[3],NULL ,&idSTUN[0]));
MapInsert(&CmdListe,Option(pSTUN1[0],pSTUN1[1],pSTUN1[2],pSTUN1[3],NULL ,&idSTUN[1]));
MapInsert(&CmdListe,Option(pSTRIK[0],pSTRIK[1],pSTRIK[2],pSTRIK[3],NULL ,&doSTRIKE));
MapInsert(&CmdListe,Option(pTAUNT[0],pTAUNT[1],pTAUNT[2],pTAUNT[3],NULL ,&doTAUNT));
MapInsert(&CmdListe,Option(pTHIEF[0],pTHIEF[1],pTHIEF[2],pTHIEF[3],NULL ,&doTHIEFEYE));
MapInsert(&CmdListe,Option(pTHROW[0],pTHROW[1],pTHROW[2],pTHROW[3],NULL ,&doTHROWSTONE));
MapInsert(&CmdListe,Option(pTIGER[0],pTIGER[1],pTIGER[2],pTIGER[3],NULL ,&doTIGERCLAW));
MapInsert(&CmdListe,Option(pTWIST[0],pTWIST[1],pTWIST[2],pTWIST[3],NULL ,&doTWISTEDSHANK));
MapInsert(&CmdListe,Option(pSHIEL[0],pSHIEL[1],pSHIEL[2],pSHIEL[3],NULL ,&elSHIELD));
IniListe.clear();
MapInsert(&IniListe,Option("backstabif" ,"","","",NULL,&ifBACKSTAB));
MapInsert(&IniListe,Option("bashif" ,"","","",NULL,&ifBASH));
MapInsert(&IniListe,Option("beggingif" ,"","","",NULL,&ifBEGGING));
MapInsert(&IniListe,Option("callchallengeif","","","",NULL,&ifCALLCHALLENGE));
MapInsert(&IniListe,Option("challengeforif" ,"","","",NULL,&ifCHALLENGEFOR));
MapInsert(&IniListe,Option("commandingif" ,"","","",NULL,&ifCOMMANDING));
MapInsert(&IniListe,Option("cryhavocif" ,"","","",NULL,&ifCRYHAVOC));
MapInsert(&IniListe,Option("disarmif" ,"","","",NULL,&ifDISARM));
MapInsert(&IniListe,Option("dragonpunchif" ,"","","",NULL,&ifDRAGONPUNCH));
MapInsert(&IniListe,Option("eaglestrikeif" ,"","","",NULL,&ifEAGLESTRIKE));
MapInsert(&IniListe,Option("evadeif" ,"","","",NULL,&ifEVADE));
MapInsert(&IniListe,Option("fallsif" ,"","","",NULL,&ifFALLS));
MapInsert(&IniListe,Option("feralswipeif" ,"","","",NULL,&ifFERALSWIPE));
MapInsert(&IniListe,Option("fistofwuif" ,"","","",NULL,&ifFISTSOFWU));
MapInsert(&IniListe,Option("flyingkickif" ,"","","",NULL,&ifFLYINGKICK));
MapInsert(&IniListe,Option("forageif" ,"","","",NULL,&ifFORAGE));
MapInsert(&IniListe,Option("frenzyif" ,"","","",NULL,&ifFRENZY));
MapInsert(&IniListe,Option("harmtouchif" ,"","","",NULL,&ifHARMTOUCH));
MapInsert(&IniListe,Option("pothealfastif" ,"","","",NULL,&ifPOTHEALFAST));
MapInsert(&IniListe,Option("pothealoverif" ,"","","",NULL,&ifPOTHEALOVER));
MapInsert(&IniListe,Option("hideif" ,"","","",NULL,&ifHIDE));
MapInsert(&IniListe,Option("intimidationif" ,"","","",NULL,&ifINTIMIDATION));
MapInsert(&IniListe,Option("joltif" ,"","","",NULL,&ifJOLT));
MapInsert(&IniListe,Option("kickif" ,"","","",NULL,&ifKICK));
MapInsert(&IniListe,Option("layhandif" ,"","","",NULL,&ifLAYHAND));
MapInsert(&IniListe,Option("leopardclawif" ,"","","",NULL,&ifLEOPARDCLAW));
MapInsert(&IniListe,Option("mendif" ,"","","",NULL,&ifMEND));
MapInsert(&IniListe,Option("pickpocketif" ,"","","",NULL,&ifPICKPOCKET));
MapInsert(&IniListe,Option("provokeif" ,"","","",NULL,&ifPROVOKE));
MapInsert(&IniListe,Option("ragevolleyif" ,"","","",NULL,&ifRAGEVOLLEY));
MapInsert(&IniListe,Option("rakeif" ,"","","",NULL,&ifRAKE));
MapInsert(&IniListe,Option("roundkickif" ,"","","",NULL,&ifROUNDKICK));
MapInsert(&IniListe,Option("sensetrapif" ,"","","",NULL,&ifSENSETRAP));
MapInsert(&IniListe,Option("slamif" ,"","","",NULL,&ifSLAM));
MapInsert(&IniListe,Option("sneakif" ,"","","",NULL,&ifSNEAK));
MapInsert(&IniListe,Option("strikeif" ,"","","",NULL,&ifSTRIKE));
MapInsert(&IniListe,Option("stunningif" ,"","","",NULL,&ifSTUNNING));
MapInsert(&IniListe,Option("tauntif" ,"","","",NULL,&ifTAUNT));
MapInsert(&IniListe,Option("thiefeyeif" ,"","","",NULL,&ifTHIEFEYE));
MapInsert(&IniListe,Option("throwstoneif" ,"","","",NULL,&ifTHROWSTONE));
MapInsert(&IniListe,Option("tigerclawif" ,"","","",NULL,&ifTIGERCLAW));
MapInsert(&IniListe,Option("twistedshankif" ,"","","",NULL,&ifTWISTEDSHANK));
MapInsert(&IniListe,Option("stickcmd" ,"","","",NULL,&StickCMD));
MapInsert(&IniListe,Option("downshit0" ,"","","",NULL,&DOWNSHIT[0]));
MapInsert(&IniListe,Option("downshit1" ,"","","",NULL,&DOWNSHIT[1]));
MapInsert(&IniListe,Option("downshit2" ,"","","",NULL,&DOWNSHIT[2]));
MapInsert(&IniListe,Option("downshit3" ,"","","",NULL,&DOWNSHIT[3]));
MapInsert(&IniListe,Option("downshit4" ,"","","",NULL,&DOWNSHIT[4]));
MapInsert(&IniListe,Option("downshit5" ,"","","",NULL,&DOWNSHIT[5]));
MapInsert(&IniListe,Option("downshit6" ,"","","",NULL,&DOWNSHIT[6]));
MapInsert(&IniListe,Option("downshit7" ,"","","",NULL,&DOWNSHIT[7]));
MapInsert(&IniListe,Option("holyshit0" ,"","","",NULL,&HOLYSHIT[0]));
MapInsert(&IniListe,Option("holyshit1" ,"","","",NULL,&HOLYSHIT[1]));
MapInsert(&IniListe,Option("holyshit2" ,"","","",NULL,&HOLYSHIT[2]));
MapInsert(&IniListe,Option("holyshit3" ,"","","",NULL,&HOLYSHIT[3]));
MapInsert(&IniListe,Option("holyshit4" ,"","","",NULL,&HOLYSHIT[4]));
MapInsert(&IniListe,Option("holyshit5" ,"","","",NULL,&HOLYSHIT[5]));
MapInsert(&IniListe,Option("holyshit6" ,"","","",NULL,&HOLYSHIT[6]));
MapInsert(&IniListe,Option("holyshit7" ,"","","",NULL,&HOLYSHIT[7]));
VarListe.clear();
MapInsert(&VarListe,Option("idleopardclaw" ,"","","",NULL,&idLEOPARDCLAW));
MapInsert(&VarListe,Option("idragevolley" ,"","","",NULL,&idRAGEVOLLEY));
MapInsert(&VarListe,Option("idbackstab" ,"","","",NULL,&idBACKSTAB));
MapInsert(&VarListe,Option("idbash" ,"","","",NULL,&idBASH));
MapInsert(&VarListe,Option("idbegging" ,"","","",NULL,&idBEGGING));
MapInsert(&VarListe,Option("idcallchallenge","","","",NULL,&idCALLCHALLENGE));
MapInsert(&VarListe,Option("idcommanding" ,"","","",NULL,&idCOMMANDING));
MapInsert(&VarListe,Option("idcryhavoc" ,"","","",NULL,&idCRYHAVOC));
MapInsert(&VarListe,Option("iddisarm" ,"","","",NULL,&idDISARM));
MapInsert(&VarListe,Option("iddragonpunch" ,"","","",NULL,&idDRAGONPUNCH));
MapInsert(&VarListe,Option("ideaglestrike" ,"","","",NULL,&idEAGLESTRIKE));
MapInsert(&VarListe,Option("idescape" ,"","","",NULL,&idESCAPE));
MapInsert(&VarListe,Option("idferalswipe" ,"","","",NULL,&idFERALSWIPE));
MapInsert(&VarListe,Option("idfistsofwu" ,"","","",NULL,&idFISTSOFWU));
MapInsert(&VarListe,Option("idflyingkick" ,"","","",NULL,&idFLYINGKICK));
MapInsert(&VarListe,Option("idforage" ,"","","",NULL,&idFORAGE));
MapInsert(&VarListe,Option("idfrenzy" ,"","","",NULL,&idFRENZY));
MapInsert(&VarListe,Option("idharmtouch" ,"","","",NULL,&idHARMTOUCH));
MapInsert(&VarListe,Option("idhide" ,"","","",NULL,&idHIDE));
MapInsert(&VarListe,Option("idintimidation" ,"","","",NULL,&idINTIMIDATION));
MapInsert(&VarListe,Option("idjolt" ,"","","",NULL,&idJOLT));
MapInsert(&VarListe,Option("idkick" ,"","","",NULL,&idKICK));
MapInsert(&VarListe,Option("idlayhand" ,"","","",NULL,&idLAYHAND));
MapInsert(&VarListe,Option("idmend" ,"","","",NULL,&idMEND));
MapInsert(&VarListe,Option("idpickpocket" ,"","","",NULL,&idPICKPOCKET));
MapInsert(&VarListe,Option("idrake" ,"","","",NULL,&idRAKE));
MapInsert(&VarListe,Option("idroundkick" ,"","","",NULL,&idROUNDKICK));
MapInsert(&VarListe,Option("idsensetrap" ,"","","",NULL,&idSENSETRAP));
MapInsert(&VarListe,Option("idslam" ,"","","",NULL,&idSLAM));
MapInsert(&VarListe,Option("idsneak" ,"","","",NULL,&idSNEAK));
MapInsert(&VarListe,Option("idstrike" ,"","","",NULL,&idSTRIKE));
MapInsert(&VarListe,Option("idtaunt" ,"","","",NULL,&idTAUNT));
MapInsert(&VarListe,Option("idthiefeye" ,"","","",NULL,&idTHIEFEYE));
MapInsert(&VarListe,Option("idthrowstone" ,"","","",NULL,&idTHROWSTONE));
MapInsert(&VarListe,Option("idtigerclaw" ,"","","",NULL,&idTIGERCLAW));
MapInsert(&VarListe,Option("idfeign0" ,"","","",NULL,&idFEIGN[0]));
MapInsert(&VarListe,Option("idfeign1" ,"","","",NULL,&idFEIGN[1]));
MapInsert(&VarListe,Option("idpetmend" ,"","","",NULL,&idPETMEND));
MapInsert(&VarListe,Option("idpothealfast" ,"","","",NULL,&idPOTHEALFAST));
MapInsert(&VarListe,Option("idpothealover" ,"","","",NULL,&idPOTHEALOVER));
MapInsert(&VarListe,Option("idprovoke0" ,"","","",NULL,&idPROVOKE[0]));
MapInsert(&VarListe,Option("idprovoke1" ,"","","",NULL,&idPROVOKE[1]));
MapInsert(&VarListe,Option("idstun0" ,"","","",NULL,&idSTUN[0]));
MapInsert(&VarListe,Option("idstun1" ,"","","",NULL,&idSTUN[1]));
ZeroMemory(ColorArray,sizeof(ColorArray));
ColorArray[13] =true; // Attack/AutoFire/Enrage/Infuriate
ColorArray[265]=true; // Hits Target
ColorArray[267]=true; // Miss Target
ColorArray[266]=true; // Hits me
ColorArray[268]=true; // Miss me
ColorArray[270]=true; // Failed Hide/Sneak
ColorArray[273]=true; // Failed FD????
ColorArray[288]=true; // Target begin to cast
ColorArray[289]=true; // Spells results, broken fd
ColorArray[306]=true; // NPC Enrage/Infuriate
ColorArray[328]=true; // Pet Hits Target
ColorArray[337]=true; // Pet Messages
ZeroMemory(AttackArray,sizeof(AttackArray));
AttackArray[0]=true;
AttackArray[1]=true;
AttackArray[2]=true;
AttackArray[3]=true;
AttackArray[4]=true;
AttackArray[5]=true; // hit with main hand
AttackArray[6]=true;
AttackArray[7]=true;
AttackArray[8]=true; // punch
AttackArray[9]=true;
AttackArray[10]=true;
AttackArray[11]=true;
AttackArray[12]=true; // hit with offhand
AttackArray[42]=true; // casting type 1
AttackArray[43]=true; // casting type 2
AttackArray[44]=true; // casting type 3
AttackArray[80]=true; // attacking
AttackArray[129]=true; // attacking
AttackArray[144]=true; // attacking
ZeroMemory(IdlingArray,sizeof(IdlingArray));
IdlingArray[26]=true; // mezzed maybe?
IdlingArray[32]=true; // sitting
IdlingArray[71]=true; // standing after sitting
IdlingArray[110]=true; // standing still
SaveIndx=0;
pMeleeEvent=new Blech('#');
ZeroMemory(SaveList,sizeof(SaveList));
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("Auto fire off#*#" ,AUTOFIREOFF ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("Auto fire on#*#" ,AUTOFIREON ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#Attacking #*# Master.#*#" ,PETATTK ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#Sorry#*#calming down.#*#" ,PETBACK ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#Waiting for your order to attack, Master.#*#" ,PETHOLD ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*# begins casting a spell#*#" ,CASTING ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*# begins to cast#*#" ,CASTING ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*# has become ENRAGED#*#" ,ENRAGEON ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*# is no longer enraged#*#" ,ENRAGEOFF ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*# is infuriated#*#" ,INFURIATEON ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*# no longer infuriated#*#" ,INFURIATEOFF ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*# has fallen to the ground#*#" ,FALLEN ,(void *)1);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#You are no longer feigning death#*#" ,BROKEN ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#Your body aches from a wave of pain#*#" ,BROKEN ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#The strength of your will allows you to resume feigning death#*#" ,RESUME ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#You failed to hide yourself#*#" ,HIDEOFF ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#You stop hiding#*#" ,HIDEOFF ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#You have moved and are no longer hidden#*#" ,HIDEOFF ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#You have hidden yourself from view#*#" ,HIDEON ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#You are as quiet as a herd of running elephants#*#" ,SNEAKOFF ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#You stop sneaking#*#" ,SNEAKOFF ,(void *)0);
SaveList[SaveIndx++]=pMeleeEvent->AddEvent("#*#You are as quiet as a cat stalking its prey#*#" ,SNEAKON ,(void *)0);
pMeleeTypes= new MQ2MeleeType;
AddMQ2Data("Melee",DataMelee);
AddMQ2Data("meleemvb",datameleemvb);
AddMQ2Data("meleemvi",datameleemvi);
AddMQ2Data("meleemvs",datameleemvs);
AddCommand("/EnrageON",EnrageON);
AddCommand("/EnrageOFF",EnrageOFF);
AddCommand("/InfuriateON",InfuriateON);
AddCommand("/InfuriateOFF",InfuriateOFF);
AddCommand("/KillThis",KillThis);
AddCommand("/Melee",Melee);
AddCommand("/ThrowIt",ThrowIT);
}
PLUGIN_API VOID SetGameState(DWORD GameState) {
Bindding(GameState==GAMESTATE_INGAME);
if(GameState==GAMESTATE_INGAME) {
if(!Loaded) Configure();
} else if(GameState!=GAMESTATE_LOGGINGIN) {
if(Loaded) Loaded=false;
}
}
PLUGIN_API DWORD OnIncomingChat(PCHAR Line, DWORD Color) {
if(ColorArray[Color & 0x1FF] && doSKILL && gbInZone && pMeleeEvent) switch(Color) {
case 265: SwingHits++; break;
case 267: SwingHits++; break;
case 266: TakenHits++; break;
case 268: TakenHits++; break;
default : pMeleeEvent->Feed(Line);
}
return 0;
}
PLUGIN_API VOID OnPulse(VOID) {
if(doSKILL && Loaded && gbInZone && SpawnMe()) {
if(PCHARINFO2 Me=GetCharInfo2()) {
if(GetCharInfo2()->Shrouded!=Shrouded) {
SetGameState(GAMESTATE_UNLOADING);
SetGameState(GAMESTATE_INGAME);
}
if(!HiddenTimer && IsInvisible()) HiddenTimer=(DWORD)clock();
if(!SilentTimer && IsSneaking()) SilentTimer=(DWORD)clock();
Travel=SpeedRun(SpawnMe());
if(Moving=(Travel>0.05 || Travel<-0.05)) TimerMove=(DWORD)clock()+delay*5;
Immobile=(!(MQ2Globals::gbMoving) && (!TimerMove || (DWORD)clock()>TimerMove));
if(doPETASSIST) if(PSPAWNINFO Pet=SpawnPet()) {
if(AttackArray[Pet->Animation & 0xFF]) PetSEEN();
else if(!PetOnHold && (DWORD)clock()>PetOnAttk && IdlingArray[Pet->Animation & 0xFF]) PetBACK();
}
if(MeleeTarg && (!pTarget || MeleeType!=SpawnMask(GetSpawnID(MeleeTarg)))) Override(NULL,"");
if((DWORD)clock()>MeleeTime) {
MeleeTime=(DWORD)clock()+delay;
MeleeHandle();
}
}
}
}
PLUGIN_API VOID ShutdownPlugin() {
SetGameState(GAMESTATE_UNLOADING);
RemoveCommand("/EnrageON");
RemoveCommand("/EnrageOFF");
RemoveCommand("/InfuriateON");
RemoveCommand("/InfuriateOFF");
RemoveCommand("/KillThis");
RemoveCommand("/Melee");
RemoveCommand("/ThrowIt");
RemoveMQ2Data("Melee");
RemoveMQ2Data("meleemvs");
RemoveMQ2Data("meleemvi");
RemoveMQ2Data("meleemvb");
pMeleeEvent->Reset();
delete pMeleeEvent;
delete pMeleeTypes;
Bindding(false);
}
