| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022 |
- using System.Drawing;
- using Server.MirDatabase;
- using Server.MirEnvir;
- using System.Globalization;
- using System.Numerics;
- using System.Text.RegularExpressions;
- using S = ServerPackets;
- using Timer = Server.MirEnvir.Timer;
- using Server.MirNetwork;
- using Server.Library.MirDatabase;
- namespace Server.MirObjects
- {
- public class NPCSegment
- {
- protected static Envir Envir
- {
- get { return Envir.Main; }
- }
- protected static MessageQueue MessageQueue
- {
- get { return MessageQueue.Instance; }
- }
- public NPCPage Page;
- public readonly string Key;
- public List<NPCChecks> CheckList = new List<NPCChecks>();
- public List<NPCActions> ActList = new List<NPCActions>(), ElseActList = new List<NPCActions>();
- public List<string> Say, ElseSay, Buttons, ElseButtons, GotoButtons;
- public string Param1;
- public int Param1Instance, Param2, Param3;
- public List<string> Args = new List<string>();
- public NPCSegment(NPCPage page, List<string> say, List<string> buttons, List<string> elseSay, List<string> elseButtons, List<string> gotoButtons)
- {
- Page = page;
- Say = say;
- Buttons = buttons;
- ElseSay = elseSay;
- ElseButtons = elseButtons;
- GotoButtons = gotoButtons;
- }
- public string[] ParseArguments(string[] words)
- {
- Regex r = new Regex(@"\%ARG\((\d+)\)");
- for (int i = 0; i < words.Length; i++)
- {
- foreach (Match m in r.Matches(words[i].ToUpper()))
- {
- if (!m.Success) continue;
- int sequence = Convert.ToInt32(m.Groups[1].Value);
- if (Page.Args.Count >= (sequence + 1)) words[i] = words[i].Replace(m.Groups[0].Value, Page.Args[sequence]);
- }
- }
- return words;
- }
- public void AddVariable(MapObject player, string key, string value)
- {
- Regex regex = new Regex(@"[A-Za-z][0-9]");
- if (!regex.Match(key).Success) return;
- for (int i = 0; i < player.NPCVar.Count; i++)
- {
- if (!String.Equals(player.NPCVar[i].Key, key, StringComparison.CurrentCultureIgnoreCase)) continue;
- player.NPCVar[i] = new KeyValuePair<string, string>(player.NPCVar[i].Key, value);
- return;
- }
- player.NPCVar.Add(new KeyValuePair<string, string>(key, value));
- }
- public string FindVariable(MapObject player, string key)
- {
- Regex regex = new Regex(@"\%[A-Za-z][0-9]");
- if (!regex.Match(key).Success) return key;
- string tempKey = key.Substring(1);
- foreach (KeyValuePair<string, string> t in player.NPCVar)
- {
- if (String.Equals(t.Key, tempKey, StringComparison.CurrentCultureIgnoreCase)) return t.Value;
- }
- return key;
- }
- public void ParseCheck(string line)
- {
- var parts = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
- parts = ParseArguments(parts);
- if (parts.Length == 0) return;
- string tempString, tempString2;
- var regexFlag = new Regex(@"\[(.*?)\]");
- var regexQuote = new Regex("\"([^\"]*)\"");
- Match quoteMatch;
- switch (parts[0].ToUpper())
- {
- case "LEVEL":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.Level, parts[1], parts[2]));
- break;
- case "CHECKGOLD":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.CheckGold, parts[1], parts[2]));
- break;
- case "CHECKGUILDGOLD":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.CheckGuildGold, parts[1], parts[2]));
- break;
- case "CHECKCREDIT":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.CheckCredit, parts[1], parts[2]));
- break;
- case "CHECKITEM":
- if (parts.Length < 2) return;
- tempString = parts.Length < 3 ? "1" : parts[2];
- tempString2 = parts.Length > 3 ? parts[3] : "";
- CheckList.Add(new NPCChecks(CheckType.CheckItem, parts[1], tempString, tempString2));
- break;
- case "CHECKGENDER":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckGender, parts[1]));
- break;
- case "CHECKCLASS":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckClass, parts[1]));
- break;
- case "DAYOFWEEK":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckDay, parts[1]));
- break;
- case "HOUR":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckHour, parts[1]));
- break;
- case "MIN":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckMinute, parts[1]));
- break;
- //cant use stored var
- case "CHECKNAMELIST":
- if (parts.Length < 2) return;
- quoteMatch = regexQuote.Match(line);
- string listPath = parts[1];
- if (quoteMatch.Success)
- listPath = quoteMatch.Groups[1].Captures[0].Value;
- var fileName = Path.Combine(Settings.NameListPath, listPath);
- string sDirectory = Path.GetDirectoryName(fileName);
- Directory.CreateDirectory(sDirectory);
- if (File.Exists(fileName))
- CheckList.Add(new NPCChecks(CheckType.CheckNameList, fileName));
- break;
- //cant use stored var
- case "CHECKGUILDNAMELIST":
- if (parts.Length < 2) return;
- quoteMatch = regexQuote.Match(line);
- listPath = parts[1];
- if (quoteMatch.Success)
- listPath = quoteMatch.Groups[1].Captures[0].Value;
- fileName = Path.Combine(Settings.NameListPath, listPath);
- sDirectory = Path.GetDirectoryName(fileName);
- Directory.CreateDirectory(sDirectory);
- if (File.Exists(fileName))
- CheckList.Add(new NPCChecks(CheckType.CheckGuildNameList, fileName));
- break;
- case "ISADMIN":
- CheckList.Add(new NPCChecks(CheckType.IsAdmin));
- break;
- case "CHECKPKPOINT":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.CheckPkPoint, parts[1], parts[2]));
- break;
- case "CHECKRANGE":
- if (parts.Length < 4) return;
- CheckList.Add(new NPCChecks(CheckType.CheckRange, parts[1], parts[2], parts[3]));
- break;
- case "CHECKMAP":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckMap, parts[1]));
- break;
- case "MAPLIGHT":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckMapLight, parts[1]));
- break;
- //cant use stored var
- case "CHECK":
- if (parts.Length < 3) return;
- var match = regexFlag.Match(parts[1]);
- if (match.Success)
- {
- string flagIndex = match.Groups[1].Captures[0].Value;
- CheckList.Add(new NPCChecks(CheckType.Check, flagIndex, parts[2]));
- }
- break;
- case "CHECKHUM":
- if (parts.Length < 4) return;
- tempString = parts.Length < 5 ? "1" : parts[4];
- CheckList.Add(new NPCChecks(CheckType.CheckHum, parts[1], parts[2], parts[3], tempString));
- break;
- case "CHECKMON":
- if (parts.Length < 4) return;
- tempString = parts.Length < 5 ? "1" : parts[4];
- CheckList.Add(new NPCChecks(CheckType.CheckMon, parts[1], parts[2], parts[3], tempString));
- break;
- case "CHECKEXACTMON":
- if (parts.Length < 5) return;
- tempString = parts.Length < 6 ? "1" : parts[5];
- CheckList.Add(new NPCChecks(CheckType.CheckExactMon, parts[1], parts[2], parts[3], parts[4], tempString));
- break;
- case "RANDOM":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.Random, parts[1]));
- break;
- case "GROUPLEADER":
- CheckList.Add(new NPCChecks(CheckType.Groupleader));
- break;
- case "GROUPCOUNT":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.GroupCount, parts[1], parts[2]));
- break;
- case "GROUPCHECKNEARBY":
- CheckList.Add(new NPCChecks(CheckType.GroupCheckNearby));
- break;
- case "PETCOUNT":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.PetCount, parts[1], parts[2]));
- break;
- case "PETLEVEL":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.PetLevel, parts[1], parts[2]));
- break;
- case "HEROLEVEL":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.HeroLevel, parts[1], parts[2]));
- break;
- case "CHECKHEROCLASS":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckHeroClass, parts[1]));
- break;
- case "CHECKHEROGENDER":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckHeroGender, parts[1]));
- break;
- case "CHECKHEROITEM":
- if (parts.Length < 2) return;
- tempString = parts.Length < 3 ? "1" : parts[2];
- tempString2 = parts.Length > 3 ? parts[3] : "";
- CheckList.Add(new NPCChecks(CheckType.CheckHeroItem, parts[1], tempString, tempString2));
- break;
- case "CHECKCALC":
- if (parts.Length < 4) return;
- CheckList.Add(new NPCChecks(CheckType.CheckCalc, parts[1], parts[2], parts[3]));
- break;
- case "INGUILD":
- string guildName = string.Empty;
- if (parts.Length > 1) guildName = parts[1];
- CheckList.Add(new NPCChecks(CheckType.InGuild, guildName));
- break;
- case "CHECKQUEST":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.CheckQuest, parts[1], parts[2]));
- break;
- case "CHECKRELATIONSHIP":
- CheckList.Add(new NPCChecks(CheckType.CheckRelationship));
- break;
- case "CHECKWEDDINGRING":
- CheckList.Add(new NPCChecks(CheckType.CheckWeddingRing));
- break;
- case "CHECKPET":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckPet, parts[1]));
- break;
- case "HASBAGSPACE":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.HasBagSpace, parts[1], parts[2]));
- break;
- case "ISNEWHUMAN":
- CheckList.Add(new NPCChecks(CheckType.IsNewHuman));
- break;
- case "CHECKCONQUEST":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckConquest, parts[1]));
- break;
- case "AFFORDGUARD":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.AffordGuard, parts[1], parts[2]));
- break;
- case "AFFORDGATE":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.AffordGate, parts[1], parts[2]));
- break;
- case "AFFORDWALL":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.AffordWall, parts[1], parts[2]));
- break;
- case "AFFORDSIEGE":
- if (parts.Length < 3) return;
- CheckList.Add(new NPCChecks(CheckType.AffordSiege, parts[1], parts[2]));
- break;
- case "CHECKPERMISSION":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckPermission, parts[1]));
- break;
- case "CONQUESTAVAILABLE":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.ConquestAvailable, parts[1]));
- break;
- case "CONQUESTOWNER":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.ConquestOwner, parts[1]));
- break;
- case "CHECKTIMER":
- if (parts.Length < 4) return;
- CheckList.Add(new NPCChecks(CheckType.CheckTimer, parts[1], parts[2], parts[3]));
- break;
- case "HASGT":
- if (parts.Length < 1)
- {
- return;
- }
- CheckList.Add(new NPCChecks(CheckType.HasGT));
- break;
- case "CHECKBUFF":
- if (parts.Length < 2) return;
- CheckList.Add(new NPCChecks(CheckType.CheckBuff, parts[1]));
- break;
- }
- }
- public void ParseAct(List<NPCActions> acts, string line)
- {
- var parts = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
- parts = ParseArguments(parts);
- if (parts.Length == 0) return;
- string fileName;
- var regexQuote = new Regex("\"([^\"]*)\"");
- var regexFlag = new Regex(@"\[(.*?)\]");
- Match quoteMatch = null;
- switch (parts[0].ToUpper())
- {
- case "MOVE":
- if (parts.Length < 2) return;
- string tempx = parts.Length > 3 ? parts[2] : "0";
- string tempy = parts.Length > 3 ? parts[3] : "0";
- acts.Add(new NPCActions(ActionType.Move, parts[1], tempx, tempy));
- break;
- case "INSTANCEMOVE":
- if (parts.Length < 5) return;
- acts.Add(new NPCActions(ActionType.InstanceMove, parts[1], parts[2], parts[3], parts[4]));
- break;
- case "GIVEGOLD":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.GiveGold, parts[1]));
- break;
- case "TAKEGOLD":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.TakeGold, parts[1]));
- break;
- case "GIVEGUILDGOLD":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.GiveGuildGold, parts[1]));
- break;
- case "TAKEGUILDGOLD":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.TakeGuildGold, parts[1]));
- break;
- case "GIVECREDIT":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.GiveCredit, parts[1]));
- break;
- case "TAKECREDIT":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.TakeCredit, parts[1]));
- break;
- case "GIVEPEARLS":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.GivePearls, parts[1]));
- break;
- case "TAKEPEARLS":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.TakePearls, parts[1]));
- break;
- case "GIVEITEM":
- if (parts.Length < 2) return;
- string count = parts.Length < 3 ? string.Empty : parts[2];
- acts.Add(new NPCActions(ActionType.GiveItem, parts[1], count));
- break;
- case "TAKEITEM":
- if (parts.Length < 3) return;
- count = parts.Length < 3 ? string.Empty : parts[2];
- string dura = parts.Length > 3 ? parts[3] : "";
- acts.Add(new NPCActions(ActionType.TakeItem, parts[1], count, dura));
- break;
- case "GIVEEXP":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.GiveExp, parts[1]));
- break;
- case "GIVEPET":
- if (parts.Length < 2) return;
- string petcount = parts.Length > 2 ? parts[2] : "1";
- string petlevel = parts.Length > 3 ? parts[3] : "0";
- acts.Add(new NPCActions(ActionType.GivePet, parts[1], petcount, petlevel));
- break;
- case "REMOVEPET":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.RemovePet, parts[1]));
- break;
- case "CLEARPETS":
- acts.Add(new NPCActions(ActionType.ClearPets));
- break;
- case "GOTO":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.Goto, parts[1]));
- break;
- case "CALL":
- if (parts.Length < 2) return;
- quoteMatch = regexQuote.Match(line);
- string listPath = parts[1];
- if (quoteMatch.Success)
- {
- listPath = quoteMatch.Groups[1].Captures[0].Value;
- }
- fileName = Path.Combine(Settings.NPCPath, listPath + ".txt");
- if (!File.Exists(fileName)) return;
- var script = NPCScript.GetOrAdd(0, listPath, NPCScriptType.Called);
- Page.ScriptCalls.Add(script.ScriptID);
- acts.Add(new NPCActions(ActionType.Call, script.ScriptID.ToString()));
- break;
- case "BREAK":
- acts.Add(new NPCActions(ActionType.Break));
- break;
- //cant use stored var
- case "ADDNAMELIST":
- if (parts.Length < 2) return;
- quoteMatch = regexQuote.Match(line);
- listPath = parts[1];
- if (quoteMatch.Success)
- listPath = quoteMatch.Groups[1].Captures[0].Value;
- fileName = Path.Combine(Settings.NameListPath, listPath);
- string sDirectory = Path.GetDirectoryName(fileName);
- Directory.CreateDirectory(sDirectory);
- if (!File.Exists(fileName))
- File.Create(fileName).Close();
- acts.Add(new NPCActions(ActionType.AddNameList, fileName));
- break;
- //cant use stored var
- case "ADDGUILDNAMELIST":
- if (parts.Length < 2) return;
- quoteMatch = regexQuote.Match(line);
- listPath = parts[1];
- if (quoteMatch.Success)
- listPath = quoteMatch.Groups[1].Captures[0].Value;
- fileName = Path.Combine(Settings.NameListPath, listPath);
- sDirectory = Path.GetDirectoryName(fileName);
- Directory.CreateDirectory(sDirectory);
- if (!File.Exists(fileName))
- File.Create(fileName).Close();
- acts.Add(new NPCActions(ActionType.AddGuildNameList, fileName));
- break;
- //cant use stored var
- case "DELNAMELIST":
- if (parts.Length < 2) return;
- quoteMatch = regexQuote.Match(line);
- listPath = parts[1];
- if (quoteMatch.Success)
- listPath = quoteMatch.Groups[1].Captures[0].Value;
- fileName = Path.Combine(Settings.NameListPath, listPath);
- sDirectory = Path.GetDirectoryName(fileName);
- Directory.CreateDirectory(sDirectory);
- if (File.Exists(fileName))
- acts.Add(new NPCActions(ActionType.DelNameList, fileName));
- break;
- //cant use stored var
- case "DELGUILDNAMELIST":
- if (parts.Length < 2) return;
- quoteMatch = regexQuote.Match(line);
- listPath = parts[1];
- if (quoteMatch.Success)
- listPath = quoteMatch.Groups[1].Captures[0].Value;
- fileName = Path.Combine(Settings.NameListPath, listPath);
- sDirectory = Path.GetDirectoryName(fileName);
- Directory.CreateDirectory(sDirectory);
- if (File.Exists(fileName))
- acts.Add(new NPCActions(ActionType.DelGuildNameList, fileName));
- break;
- //cant use stored var
- case "CLEARNAMELIST":
- if (parts.Length < 2) return;
- quoteMatch = regexQuote.Match(line);
- listPath = parts[1];
- if (quoteMatch.Success)
- listPath = quoteMatch.Groups[1].Captures[0].Value;
- fileName = Path.Combine(Settings.NameListPath, listPath);
- sDirectory = Path.GetDirectoryName(fileName);
- Directory.CreateDirectory(sDirectory);
- if (File.Exists(fileName))
- acts.Add(new NPCActions(ActionType.ClearNameList, fileName));
- break;
- //cant use stored var
- case "CLEARGUILDNAMELIST":
- if (parts.Length < 2) return;
- quoteMatch = regexQuote.Match(line);
- listPath = parts[1];
- if (quoteMatch.Success)
- listPath = quoteMatch.Groups[1].Captures[0].Value;
- fileName = Path.Combine(Settings.NameListPath, listPath);
- sDirectory = Path.GetDirectoryName(fileName);
- Directory.CreateDirectory(sDirectory);
- if (File.Exists(fileName))
- acts.Add(new NPCActions(ActionType.ClearGuildNameList, fileName));
- break;
- case "GIVEHP":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.GiveHP, parts[1]));
- break;
- case "GIVEMP":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.GiveMP, parts[1]));
- break;
- case "CHANGELEVEL":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.ChangeLevel, parts[1]));
- break;
- case "SETPKPOINT":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.SetPkPoint, parts[1]));
- break;
- case "REDUCEPKPOINT":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.ReducePkPoint, parts[1]));
- break;
- case "INCREASEPKPOINT":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.IncreasePkPoint, parts[1]));
- break;
- case "CHANGEGENDER":
- acts.Add(new NPCActions(ActionType.ChangeGender));
- break;
- case "CHANGECLASS":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.ChangeClass, parts[1]));
- break;
- case "CHANGEHAIR":
- if (parts.Length < 2)
- {
- acts.Add(new NPCActions(ActionType.ChangeHair));
- }
- else
- {
- acts.Add(new NPCActions(ActionType.ChangeHair, parts[1]));
- }
- break;
- case "LOCALMESSAGE":
- var match = regexQuote.Match(line);
- if (match.Success)
- {
- var message = match.Groups[1].Captures[0].Value;
- var last = parts.Count() - 1;
- acts.Add(new NPCActions(ActionType.LocalMessage, message, parts[last]));
- }
- break;
- case "GLOBALMESSAGE":
- match = regexQuote.Match(line);
- if (match.Success)
- {
- var message = match.Groups[1].Captures[0].Value;
- var last = parts.Count() - 1;
- acts.Add(new NPCActions(ActionType.GlobalMessage, message, parts[last]));
- }
- break;
- case "GIVESKILL":
- if (parts.Length < 3) return;
- string spelllevel = parts.Length > 2 ? parts[2] : "0";
- acts.Add(new NPCActions(ActionType.GiveSkill, parts[1], spelllevel));
- break;
- case "REMOVESKILL":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.RemoveSkill, parts[1]));
- break;
- //cant use stored var
- case "SET":
- if (parts.Length < 3) return;
- match = regexFlag.Match(parts[1]);
- if (match.Success)
- {
- string flagIndex = match.Groups[1].Captures[0].Value;
- acts.Add(new NPCActions(ActionType.Set, flagIndex, parts[2]));
- }
- break;
- case "PARAM1":
- if (parts.Length < 2) return;
- string instanceId = parts.Length < 3 ? "1" : parts[2];
- acts.Add(new NPCActions(ActionType.Param1, parts[1], instanceId));
- break;
- case "PARAM2":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.Param2, parts[1]));
- break;
- case "PARAM3":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.Param3, parts[1]));
- break;
- case "MONGEN":
- if (parts.Length < 2) return;
- count = parts.Length < 3 ? "1" : parts[2];
- acts.Add(new NPCActions(ActionType.Mongen, parts[1], count));
- break;
- case "TIMERECALL":
- if (parts.Length < 2) return;
- string page = parts.Length > 2 ? parts[2] : "";
- acts.Add(new NPCActions(ActionType.TimeRecall, parts[1], page));
- break;
- case "TIMERECALLGROUP":
- if (parts.Length < 2) return;
- page = parts.Length > 2 ? parts[2] : "";
- acts.Add(new NPCActions(ActionType.TimeRecallGroup, parts[1], page));
- break;
- case "BREAKTIMERECALL":
- acts.Add(new NPCActions(ActionType.BreakTimeRecall));
- break;
- case "DELAYGOTO":
- if (parts.Length < 3) return;
- acts.Add(new NPCActions(ActionType.DelayGoto, parts[1], parts[2]));
- break;
- case "MONCLEAR":
- if (parts.Length < 2) return;
- instanceId = parts.Length < 3 ? "1" : parts[2];
- string mobName = parts.Length < 4 ? "" : parts[3];
- acts.Add(new NPCActions(ActionType.MonClear, parts[1], instanceId, mobName));
- break;
- case "GROUPRECALL":
- acts.Add(new NPCActions(ActionType.GroupRecall));
- break;
- case "GROUPTELEPORT":
- if (parts.Length < 2) return;
- string x;
- string y;
- if (parts.Length == 4)
- {
- instanceId = "1";
- x = parts[2];
- y = parts[3];
- }
- else
- {
- instanceId = parts.Length < 3 ? "1" : parts[2];
- x = parts.Length < 4 ? "0" : parts[3];
- y = parts.Length < 5 ? "0" : parts[4];
- }
- acts.Add(new NPCActions(ActionType.GroupTeleport, parts[1], instanceId, x, y));
- break;
- case "MOV":
- if (parts.Length < 3) return;
- match = Regex.Match(parts[1], @"[A-Z][0-9]", RegexOptions.IgnoreCase);
- quoteMatch = regexQuote.Match(line);
- string valueToStore = parts[2];
- if (quoteMatch.Success)
- valueToStore = quoteMatch.Groups[1].Captures[0].Value;
- if (match.Success)
- acts.Add(new NPCActions(ActionType.Mov, parts[1], valueToStore));
- break;
- case "CALC":
- if (parts.Length < 4) return;
- match = Regex.Match(parts[1], @"[A-Z][0-9]", RegexOptions.IgnoreCase);
- quoteMatch = regexQuote.Match(line);
- valueToStore = parts[3];
- if (quoteMatch.Success)
- valueToStore = quoteMatch.Groups[1].Captures[0].Value;
- if (match.Success)
- acts.Add(new NPCActions(ActionType.Calc, "%" + parts[1], parts[2], valueToStore, parts[1].Insert(1, "-")));
- break;
- case "GIVEBUFF":
- if (parts.Length < 4) return;
- string visible = "";
- string infinite = "";
- string stackable = "";
- if (parts.Length > 3) visible = parts[3];
- if (parts.Length > 4) infinite = parts[4];
- if (parts.Length > 5) stackable = parts[5];
- acts.Add(new NPCActions(ActionType.GiveBuff, parts[1], parts[2], visible, infinite, stackable));
- break;
- case "REMOVEBUFF":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.RemoveBuff, parts[1]));
- break;
- case "ADDTOGUILD":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.AddToGuild, parts[1]));
- break;
- case "REMOVEFROMGUILD":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.RemoveFromGuild, parts[1]));
- break;
- case "REFRESHEFFECTS":
- acts.Add(new NPCActions(ActionType.RefreshEffects));
- break;
- case "CANGAINEXP":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.CanGainExp, parts[1]));
- break;
- case "COMPOSEMAIL":
- match = regexQuote.Match(line);
- if (match.Success)
- {
- var message = match.Groups[1].Captures[0].Value;
- var last = parts.Count() - 1;
- acts.Add(new NPCActions(ActionType.ComposeMail, message, parts[last]));
- }
- break;
- case "ADDMAILGOLD":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.AddMailGold, parts[1]));
- break;
- case "ADDMAILITEM":
- if (parts.Length < 3) return;
- acts.Add(new NPCActions(ActionType.AddMailItem, parts[1], parts[2]));
- break;
- case "SENDMAIL":
- acts.Add(new NPCActions(ActionType.SendMail));
- break;
- case "GROUPGOTO":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.GroupGoto, parts[1]));
- break;
- case "ENTERMAP":
- acts.Add(new NPCActions(ActionType.EnterMap));
- break;
- case "MAKEWEDDINGRING":
- acts.Add(new NPCActions(ActionType.MakeWeddingRing));
- break;
- case "FORCEDIVORCE":
- acts.Add(new NPCActions(ActionType.ForceDivorce));
- break;
- case "LOADVALUE":
- if (parts.Length < 5) return;
- quoteMatch = regexQuote.Match(line);
- if (quoteMatch.Success)
- {
- fileName = Path.Combine(Settings.ValuePath, quoteMatch.Groups[1].Captures[0].Value);
- string group = parts[parts.Length - 2];
- string key = parts[parts.Length - 1];
- sDirectory = Path.GetDirectoryName(fileName);
- Directory.CreateDirectory(sDirectory);
- if (!File.Exists(fileName))
- File.Create(fileName).Close();
- acts.Add(new NPCActions(ActionType.LoadValue, parts[1], fileName, group, key));
- }
- break;
- case "SAVEVALUE":
- if (parts.Length < 5) return;
- MatchCollection matchCol = regexQuote.Matches(line);
- if (matchCol.Count > 0 && matchCol[0].Success)
- {
- fileName = Path.Combine(Settings.ValuePath, matchCol[0].Groups[1].Captures[0].Value);
- string value = parts[parts.Length - 1];
- if (matchCol.Count > 1 && matchCol[1].Success)
- value = matchCol[1].Groups[1].Captures[0].Value;
- string[] newParts = line.Replace(value, string.Empty).Replace("\"", "").Trim().Split(' ');
- string group = newParts[newParts.Length - 2];
- string key = newParts[newParts.Length - 1];
- sDirectory = Path.GetDirectoryName(fileName);
- Directory.CreateDirectory(sDirectory);
- if (!File.Exists(fileName))
- File.Create(fileName).Close();
- acts.Add(new NPCActions(ActionType.SaveValue, fileName, group, key, value));
- }
- break;
- case "CONQUESTGUARD":
- if (parts.Length < 3) return;
- acts.Add(new NPCActions(ActionType.ConquestGuard, parts[1], parts[2]));
- break;
- case "CONQUESTGATE":
- if (parts.Length < 3) return;
- acts.Add(new NPCActions(ActionType.ConquestGate, parts[1], parts[2]));
- break;
- case "CONQUESTWALL":
- if (parts.Length < 3) return;
- acts.Add(new NPCActions(ActionType.ConquestWall, parts[1], parts[2]));
- break;
- case "TAKECONQUESTGOLD":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.TakeConquestGold, parts[1]));
- break;
- case "SETCONQUESTRATE":
- if (parts.Length < 3) return;
- acts.Add(new NPCActions(ActionType.SetConquestRate, parts[1], parts[2]));
- break;
- case "STARTCONQUEST":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.StartConquest, parts[1]));
- break;
- case "SCHEDULECONQUEST":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.ScheduleConquest, parts[1]));
- break;
- case "OPENGATE":
- if (parts.Length < 3) return;
- acts.Add(new NPCActions(ActionType.OpenGate, parts[1], parts[2]));
- break;
- case "CLOSEGATE":
- if (parts.Length < 3) return;
- acts.Add(new NPCActions(ActionType.CloseGate, parts[1], parts[2]));
- break;
- case "OPENBROWSER":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.OpenBrowser, parts[1]));
- break;
- case "GETRANDOMTEXT":
- if (parts.Length < 3) return;
- match = Regex.Match(parts[2], @"[A-Z][0-9]", RegexOptions.IgnoreCase);
- if (match.Success)
- acts.Add(new NPCActions(ActionType.GetRandomText, parts[1], parts[2]));
- break;
- case "PLAYSOUND":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.PlaySound, parts[1]));
- break;
- case "SETTIMER":
- {
- if (parts.Length < 4) return;
- string global = parts.Length < 5 ? "" : parts[4];
- acts.Add(new NPCActions(ActionType.SetTimer, parts[1], parts[2], parts[3], global));
- }
- break;
- case "EXPIRETIMER":
- {
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.ExpireTimer, parts[1]));
- }
- break;
- case "UNEQUIPITEM":
- var type = "";
- if (parts.Length >= 2)
- {
- type = parts[1];
- }
- acts.Add(new NPCActions(ActionType.UnequipItem, type));
- break;
- case "ROLLDIE":
- if (parts.Length < 3) return;
- acts.Add(new NPCActions(ActionType.RollDie, parts[1], parts[2]));
- break;
- case "ROLLYUT":
- if (parts.Length < 3) return;
- acts.Add(new NPCActions(ActionType.RollYut, parts[1], parts[2]));
- break;
- case "DROP":
- if (parts.Length < 2) return;
- quoteMatch = regexQuote.Match(line);
- listPath = parts[1];
- if (quoteMatch.Success)
- listPath = quoteMatch.Groups[1].Captures[0].Value;
- fileName = Path.Combine(Settings.DropPath, listPath);
- acts.Add(new NPCActions(ActionType.Drop, fileName));
- break;
- case "REVIVEHERO":
- acts.Add(new NPCActions(ActionType.ReviveHero));
- break;
- case "SEALHERO":
- acts.Add(new NPCActions(ActionType.SealHero));
- break;
- case "DELETEHERO":
- acts.Add(new NPCActions(ActionType.DeleteHero));
- break;
- case "CONQUESTREPAIRALL":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.ConquestRepairAll, parts[1]));
- break;
- case "BUYGT":
- if (parts.Length < 1)
- {
- return;
- }
- acts.Add(new NPCActions(ActionType.BuyGT));
- break;
- case "TELEPORTGT":
- if (parts.Length < 1)
- {
- return;
- }
- acts.Add(new NPCActions(ActionType.TeleportGT));
- break;
- case "EXTENDGT":
- if (parts.Length < 1)
- {
- return;
- }
- acts.Add(new NPCActions(ActionType.ExtendGT));
- break;
- case "GTRECALL":
- acts.Add(new NPCActions(ActionType.GTRecall, parts[1]));
- break;
- case "GTALLRECALL":
- acts.Add(new NPCActions(ActionType.GTAllRecall));
- break;
- case "GTSALE":
- acts.Add(new NPCActions(ActionType.GTSale, parts[1]));
- break;
- case "CANCELGTSALE":
- acts.Add(new NPCActions(ActionType.GTCancelSale));
- break;
- case "HEROGIVESKILL":
- if (parts.Length < 3) return;
- spelllevel = parts.Length > 2 ? parts[2] : "0";
- acts.Add(new NPCActions(ActionType.HeroGiveSkill, parts[1], spelllevel));
- break;
- case "HEROREMOVESKILL":
- if (parts.Length < 2) return;
- acts.Add(new NPCActions(ActionType.HeroRemoveSkill, parts[1]));
- break;
- }
- }
- public List<string> ParseSay(PlayerObject player, List<string> speech)
- {
- for (var i = 0; i < speech.Count; i++)
- {
- var parts = speech[i].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
-
- if (parts.Length == 0) continue;
- foreach (var part in parts)
- {
- speech[i] = speech[i].Replace(part, ReplaceValue(player, part));
- }
- }
- return LinkFormatter.ReplacePlaceholders(speech, (type, index) => EnsureLinkInfo(player, type, index)) ?? speech;
- }
- private static void EnsureLinkInfo(PlayerObject player, string linkType, int index)
- {
- if (player?.Connection == null) return;
- switch (linkType)
- {
- case "ITEM":
- var itemInfo = Envir.GetItemInfo(index);
- if (itemInfo != null)
- player.Connection.CheckItemInfo(itemInfo);
- break;
- case "MONSTER":
- player.Connection.CheckMonsterInfo(index);
- break;
- case "NPC":
- player.Connection.CheckNPCInfo(index);
- break;
- }
- }
- public string ReplaceValue(PlayerObject player, string param)
- {
- var regex = new Regex(@"\<\$(.*)\>");
- var varRegex = new Regex(@"(.*?)\(([A-Z][0-9])\)");
- var oneValRegex = new Regex(@"(.*?)\(((.*?))\)");
- var twoValRegex = new Regex(@"(.*?)\(((.*?),(.*?))\)");
- ConquestObject Conquest;
- ConquestGuildArcherInfo Archer;
- ConquestGuildGateInfo Gate;
- ConquestGuildWallInfo Wall;
- ConquestGuildSiegeInfo Siege;
- var match = regex.Match(param);
- if (!match.Success) return param;
- string innerMatch = match.Groups[1].Captures[0].Value.ToUpper();
- Match varMatch = varRegex.Match(innerMatch);
- Match oneValMatch = oneValRegex.Match(innerMatch);
- Match twoValMatch = twoValRegex.Match(innerMatch);
- if (varRegex.Match(innerMatch).Success)
- innerMatch = innerMatch.Replace(varMatch.Groups[2].Captures[0].Value.ToUpper(), "");
- else if (twoValRegex.Match(innerMatch).Success)
- innerMatch = innerMatch.Replace(twoValMatch.Groups[2].Captures[0].Value.ToUpper(), "");
- else if (oneValRegex.Match(innerMatch).Success)
- innerMatch = innerMatch.Replace(oneValMatch.Groups[2].Captures[0].Value.ToUpper(), "");
- string newValue = string.Empty;
- switch (innerMatch)
- {
- case "MONSTERCOUNT()":
- Map map = Envir.GetMapByNameAndInstance(oneValMatch.Groups[2].Captures[0].Value.ToUpper());
- newValue = map == null ? "N/A" : map.MonsterCount.ToString();
- break;
- case "CONQUESTGUARD()":
- var val1 = FindVariable(player, "%" + twoValMatch.Groups[3].Captures[0].Value.ToUpper());
- var val2 = FindVariable(player, "%" + twoValMatch.Groups[4].Captures[0].Value.ToUpper());
- int intVal1, intVal2;
- if (int.TryParse(val1.Replace("%", ""), out intVal1) && int.TryParse(val2.Replace("%", ""), out intVal2))
- {
- Conquest = Envir.Conquests.FirstOrDefault(x => x.Info.Index == intVal1);
- if (Conquest == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NotFound);
- Archer = Conquest.ArcherList.FirstOrDefault(x => x.Index == intVal2);
- if (Archer == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NotFound);
- if (Archer.Info.Name == "" || Archer.Info.Name == null)
- newValue = GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.ConquestGuard);
- else
- newValue = Archer.Info.Name;
- if (Archer.GetRepairCost() == 0)
- newValue += GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.StillAlive);
- else
- newValue += GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.GoldCost), Archer.GetRepairCost().ToString("#,##0"));
- }
- break;
- case "CONQUESTGATE()":
- val1 = FindVariable(player, "%" + twoValMatch.Groups[3].Captures[0].Value.ToUpper());
- val2 = FindVariable(player, "%" + twoValMatch.Groups[4].Captures[0].Value.ToUpper());
- if (int.TryParse(val1.Replace("%", ""), out intVal1) && int.TryParse(val2.Replace("%", ""), out intVal2))
- {
- Conquest = Envir.Conquests.FirstOrDefault(x => x.Info.Index == intVal1);
- if (Conquest == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NotFound);
- Gate = Conquest.GateList.FirstOrDefault(x => x.Index == intVal2);
- if (Gate == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NotFound);
- if (Gate.Info.Name == "" || Gate.Info.Name == null)
- newValue = GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.ConquestGate);
- else
- newValue = Gate.Info.Name;
- if (Gate.GetRepairCost() == 0)
- newValue += GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoRepairRequired);
- else
- newValue += GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.GoldCost), Gate.GetRepairCost().ToString("#,##0"));
- }
- break;
- case "CONQUESTWALL()":
- val1 = FindVariable(player, "%" + twoValMatch.Groups[3].Captures[0].Value.ToUpper());
- val2 = FindVariable(player, "%" + twoValMatch.Groups[4].Captures[0].Value.ToUpper());
- if (int.TryParse(val1.Replace("%", ""), out intVal1) && int.TryParse(val2.Replace("%", ""), out intVal2))
- {
- Conquest = Envir.Conquests.FirstOrDefault(x => x.Info.Index == intVal1);
- if (Conquest == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NotFound);
- Wall = Conquest.WallList.FirstOrDefault(x => x.Index == intVal2);
- if (Wall == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NotFound);
- if (Wall.Info.Name == "" || Wall.Info.Name == null)
- newValue = GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.ConquestWall);
- else
- newValue = Wall.Info.Name;
- if (Wall.GetRepairCost() == 0)
- newValue += GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoRepairRequired);
- else
- newValue += GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.GoldCost), Wall.GetRepairCost().ToString("#,##0"));
- }
- break;
- case "CONQUESTSIEGE()":
- val1 = FindVariable(player, "%" + twoValMatch.Groups[3].Captures[0].Value.ToUpper());
- val2 = FindVariable(player, "%" + twoValMatch.Groups[4].Captures[0].Value.ToUpper());
- if (int.TryParse(val1.Replace("%", ""), out intVal1) && int.TryParse(val2.Replace("%", ""), out intVal2))
- {
- Conquest = Envir.Conquests.FirstOrDefault(x => x.Info.Index == intVal1);
- if (Conquest == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NotFound);
- Siege = Conquest.SiegeList.FirstOrDefault(x => x.Index == intVal2);
- if (Siege == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NotFound);
- if (Siege.Info.Name == "" || Siege.Info.Name == null)
- newValue = GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.ConquestSiege);
- else
- newValue = Siege.Info.Name;
- if (Siege.GetRepairCost() == 0)
- newValue += GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.StillAlive);
- else
- newValue += GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.GoldCost), Siege.GetRepairCost().ToString("#,##0"));
- }
- break;
- case "CONQUESTOWNER()":
- val1 = FindVariable(player, "%" + oneValMatch.Groups[2].Captures[0].Value.ToUpper());
- if (int.TryParse(val1.Replace("%", ""), out intVal1))
- {
- Conquest = Envir.Conquests.FirstOrDefault(x => x.Info.Index == intVal1);
- if (Conquest == null) return string.Empty;
- if (Conquest.Guild == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoOwner);
- newValue = Conquest.Guild.Name;
- }
- break;
- case "CONQUESTGOLD()":
- val1 = FindVariable(player, "%" + oneValMatch.Groups[2].Captures[0].Value.ToUpper());
- if (int.TryParse(val1.Replace("%", ""), out intVal1))
- {
- Conquest = Envir.Conquests.FirstOrDefault(x => x.Info.Index == intVal1);
- if (Conquest == null) return string.Empty;
- newValue = Conquest.GuildInfo.GoldStorage.ToString();
- }
- break;
- case "CONQUESTRATE()":
- val1 = FindVariable(player, "%" + oneValMatch.Groups[2].Captures[0].Value.ToUpper());
- if (int.TryParse(val1.Replace("%", ""), out intVal1))
- {
- Conquest = Envir.Conquests.FirstOrDefault(x => x.Info.Index == intVal1);
- if (Conquest == null) return string.Empty;
- newValue = Conquest.GuildInfo.NPCRate.ToString() + "%";
- }
- break;
- case "CONQUESTSCHEDULE()":
- val1 = FindVariable(player, "%" + oneValMatch.Groups[2].Captures[0].Value.ToUpper());
- if (int.TryParse(val1.Replace("%", ""), out intVal1))
- {
- Conquest = Envir.Conquests.FirstOrDefault(x => x.Info.Index == intVal1);
- if (Conquest == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.ConquestNotFound);
- if (Conquest.GuildInfo.AttackerID == -1) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoWarScheduled);
- if (Envir.Guilds.FirstOrDefault(x => x.Guildindex == Conquest.GuildInfo.AttackerID) == null)
- {
- newValue = GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoWarScheduled);
- }
- else
- {
- newValue = (Envir.Guilds.FirstOrDefault(x => x.Guildindex == Conquest.GuildInfo.AttackerID).Name);
- }
- }
- break;
- case "OUTPUT()":
- newValue = FindVariable(player, "%" + varMatch.Groups[2].Captures[0].Value.ToUpper());
- break;
- case "NPCNAME":
- for (int i = 0; i < player.CurrentMap.NPCs.Count; i++)
- {
- NPCObject ob = player.CurrentMap.NPCs[i];
- if (ob.ObjectID != player.NPCObjectID) continue;
- newValue = ob.Name.Replace("_", " ");
- }
- break;
- case "USERNAME":
- newValue = player.Name;
- break;
- case "LEVEL":
- newValue = player.Level.ToString(CultureInfo.InvariantCulture);
- break;
- case "CLASS":
- newValue = player.Class.ToString();
- break;
- case "MAP":
- newValue = player.CurrentMap.Info.FileName;
- break;
- case "X_COORD":
- newValue = player.CurrentLocation.X.ToString();
- break;
- case "Y_COORD":
- newValue = player.CurrentLocation.Y.ToString();
- break;
- case "HP":
- newValue = player.HP.ToString(CultureInfo.InvariantCulture);
- break;
- case "MAXHP":
- newValue = player.Stats[Stat.HP].ToString(CultureInfo.InvariantCulture);
- break;
- case "MP":
- newValue = player.MP.ToString(CultureInfo.InvariantCulture);
- break;
- case "MAXMP":
- newValue = player.Stats[Stat.MP].ToString(CultureInfo.InvariantCulture);
- break;
- case "GAMEGOLD":
- newValue = player.Account.Gold.ToString(CultureInfo.InvariantCulture);
- break;
- case "CREDIT":
- newValue = player.Account.Credit.ToString(CultureInfo.InvariantCulture);
- break;
- case "ARMOUR":
- newValue = player.Info.Equipment[(int)EquipmentSlot.Armour] != null ?
- player.Info.Equipment[(int)EquipmentSlot.Armour].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoArmour);
- break;
- case "WEAPON":
- newValue = player.Info.Equipment[(int)EquipmentSlot.Weapon] != null ?
- player.Info.Equipment[(int)EquipmentSlot.Weapon].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoWeapon);
- break;
- case "RING_L":
- newValue = player.Info.Equipment[(int)EquipmentSlot.RingL] != null ?
- player.Info.Equipment[(int)EquipmentSlot.RingL].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoRing);
- break;
- case "RING_R":
- newValue = player.Info.Equipment[(int)EquipmentSlot.RingR] != null ?
- player.Info.Equipment[(int)EquipmentSlot.RingR].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoRing);
- break;
- case "BRACELET_L":
- newValue = player.Info.Equipment[(int)EquipmentSlot.BraceletL] != null ?
- player.Info.Equipment[(int)EquipmentSlot.BraceletL].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoBracelet);
- break;
- case "BRACELET_R":
- newValue = player.Info.Equipment[(int)EquipmentSlot.BraceletR] != null ?
- player.Info.Equipment[(int)EquipmentSlot.BraceletR].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoBracelet);
- break;
- case "NECKLACE":
- newValue = player.Info.Equipment[(int)EquipmentSlot.Necklace] != null ?
- player.Info.Equipment[(int)EquipmentSlot.Necklace].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoNecklace);
- break;
- case "BELT":
- newValue = player.Info.Equipment[(int)EquipmentSlot.Belt] != null ?
- player.Info.Equipment[(int)EquipmentSlot.Belt].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoBelt);
- break;
- case "BOOTS":
- newValue = player.Info.Equipment[(int)EquipmentSlot.Boots] != null ?
- player.Info.Equipment[(int)EquipmentSlot.Boots].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoBoots);
- break;
- case "HELMET":
- newValue = player.Info.Equipment[(int)EquipmentSlot.Helmet] != null ?
- player.Info.Equipment[(int)EquipmentSlot.Helmet].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoHelmet);
- break;
- case "AMULET":
- newValue = player.Info.Equipment[(int)EquipmentSlot.Amulet] != null ?
- player.Info.Equipment[(int)EquipmentSlot.Amulet].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoAmulet);
- break;
- case "STONE":
- newValue = player.Info.Equipment[(int)EquipmentSlot.Stone] != null ?
- player.Info.Equipment[(int)EquipmentSlot.Stone].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoStone);
- break;
- case "TORCH":
- newValue = player.Info.Equipment[(int)EquipmentSlot.Torch] != null ?
- player.Info.Equipment[(int)EquipmentSlot.Torch].FriendlyName : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoTorch);
- break;
- case "DATE":
- newValue = Envir.Now.ToShortDateString();
- break;
- case "MAPLIGHT":
- newValue = Envir.Lights.ToString();
- break;
- case "USERCOUNT":
- newValue = Envir.PlayerCount.ToString(CultureInfo.InvariantCulture);
- break;
- case "PKPOINT":
- newValue = player.PKPoints.ToString();
- break;
- case "GUILDWARTIME":
- newValue = Settings.Guild_WarTime.ToString();
- break;
- case "GUILDWARFEE":
- newValue = Settings.Guild_WarCost.ToString();
- break;
- case "PARCELAMOUNT":
- newValue = player.GetMailAwaitingCollectionAmount().ToString();
- break;
- case "GUILDNAME":
- if (player.MyGuild == null) return GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoGuild);
- else
- newValue = string.Format("{0} {1}",player.MyGuild.Name, GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.Guild));
- break;
- case "ROLLRESULT":
- newValue = player.NPCData.TryGetValue("NPCRollResult", out object _rollResult) ? _rollResult.ToString() : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NotRolled);
- break;
- case "MOUNTLOYALTY":
- if (!player.Mount.HasMount)
- {
- newValue = GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoMount);
- }
- else
- {
- newValue = $"{player.Info.Equipment[(int)EquipmentSlot.Mount].CurrentDura} ({player.Info.Equipment[(int)EquipmentSlot.Mount].MaxDura})";
- }
- break;
- case "MOUNT":
- if (player.Mount.HasMount)
- {
- newValue = player.Info.Equipment[(int)EquipmentSlot.Mount].FriendlyName;
- }
- else
- {
- newValue = GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoMount);
- }
- break;
- default:
- newValue = string.Empty;
- break;
- case "GUILDEXTENDFEE":
- if (player.MyGuild != null && player.MyGuild.HasGT)
- {
- newValue = GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.ExpireOnExtendFee), player.MyGuild.GTRent.ToString(), Settings.ExtendGT.ToString())
- ;
- }
- else
- {
- newValue = GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.None);
- }
- break;
- case "GUILDRENTFEE":
- newValue = Settings.BuyGTGold.ToString();
- break;
- case "GUILDGTRENTALDAYSLEFT":
- if (player.MyGuild == null)
- {
- newValue = "0";
- break;
- }
- newValue = (player.MyGuild.GTRent - Envir.Now).Days.ToString();
- break;
- case "AGITGUILDNAME":
- if (player.MyGuild == null)
- {
- newValue = GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.UpperNoGuild);
- break;
- }
- newValue = (player.MyGuild.Name);
- break;
- }
- if (string.IsNullOrEmpty(newValue)) return param;
- return param.Replace(match.Value, newValue);
- }
- public string ReplaceValue(MonsterObject Monster, string param)
- {
- var regex = new Regex(@"\<\$(.*)\>");
- var varRegex = new Regex(@"(.*?)\(([A-Z][0-9])\)");
- var match = regex.Match(param);
- if (!match.Success) return param;
- string innerMatch = match.Groups[1].Captures[0].Value.ToUpper();
- Match varMatch = varRegex.Match(innerMatch);
- if (varRegex.Match(innerMatch).Success)
- innerMatch = innerMatch.Replace(varMatch.Groups[2].Captures[0].Value.ToUpper(), "");
- string newValue = string.Empty;
- switch (innerMatch)
- {
- case "OUTPUT()":
- newValue = FindVariable(Monster, "%" + varMatch.Groups[2].Captures[0].Value.ToUpper());
- break;
- case "USERNAME":
- newValue = Monster.Name;
- break;
- case "LEVEL":
- newValue = Monster.Level.ToString(CultureInfo.InvariantCulture);
- break;
- case "MAP":
- newValue = Monster.CurrentMap.Info.FileName;
- break;
- case "X_COORD":
- newValue = Monster.CurrentLocation.X.ToString();
- break;
- case "Y_COORD":
- newValue = Monster.CurrentLocation.Y.ToString();
- break;
- case "HP":
- newValue = Monster.HP.ToString(CultureInfo.InvariantCulture);
- break;
- case "MAXHP":
- newValue = Monster.Stats[Stat.HP].ToString(CultureInfo.InvariantCulture);
- break;
- case "DATE":
- newValue = Envir.Now.ToShortDateString();
- break;
- case "MAPLIGHT":
- newValue = Envir.Lights.ToString();
- break;
- case "USERCOUNT":
- newValue = Envir.PlayerCount.ToString(CultureInfo.InvariantCulture);
- break;
- case "GUILDWARTIME":
- newValue = Settings.Guild_WarTime.ToString();
- break;
- case "GUILDWARFEE":
- newValue = Settings.Guild_WarCost.ToString();
- break;
- default:
- newValue = string.Empty;
- break;
- }
- if (string.IsNullOrEmpty(newValue)) return param;
- return param.Replace(match.Value, newValue);
- }
- public bool Check()
- {
- var failed = false;
- for (int i = 0; i < CheckList.Count; i++)
- {
- NPCChecks check = CheckList[i];
- List<string> param = check.Params.ToList();
- uint tempUint;
- int tempInt;
- int tempInt2;
- Map map;
- switch (check.Type)
- {
- case CheckType.CheckDay:
- var day = Envir.Now.DayOfWeek.ToString().ToUpper();
- var dayToCheck = param[0].ToUpper();
- failed = day != dayToCheck;
- break;
- case CheckType.CheckHour:
- if (!uint.TryParse(param[0], out tempUint))
- {
- failed = true;
- break;
- }
- var hour = Envir.Now.Hour;
- var hourToCheck = tempUint;
- failed = hour != hourToCheck;
- break;
- case CheckType.CheckMinute:
- if (!uint.TryParse(param[0], out tempUint))
- {
- failed = true;
- break;
- }
- var minute = Envir.Now.Minute;
- var minuteToCheck = tempUint;
- failed = minute != minuteToCheck;
- break;
- case CheckType.CheckMapLight:
- var globalLight = Envir.Lights.ToString().ToUpperInvariant();
- var checkValue = param.Count > 0 ? param[0]?.Trim().ToUpperInvariant() : string.Empty;
- failed = string.IsNullOrEmpty(checkValue) || globalLight != checkValue;
- break;
- case CheckType.CheckHum:
- if (!int.TryParse(param[1], out tempInt) || !int.TryParse(param[3], out tempInt2))
- {
- failed = true;
- break;
- }
- map = Envir.GetMapByNameAndInstance(param[2], tempInt2);
- if (map == null)
- {
- failed = true;
- break;
- }
- failed = !Compare(param[0], map.Players.Count(), tempInt);
- break;
- case CheckType.CheckMon:
- if (!int.TryParse(param[1], out tempInt) || !int.TryParse(param[3], out tempInt2))
- {
- failed = true;
- break;
- }
- map = Envir.GetMapByNameAndInstance(param[2], tempInt2);
- if (map == null)
- {
- failed = true;
- break;
- }
- failed = !Compare(param[0], map.MonsterCount, tempInt);
- break;
- case CheckType.CheckExactMon:
- if (Envir.GetMonsterInfo(param[0]) == null)
- {
- failed = true;
- break;
- }
- if (!int.TryParse(param[2], out tempInt) || !int.TryParse(param[4], out tempInt2))
- {
- failed = true;
- break;
- }
- map = Envir.GetMapByNameAndInstance(param[3], tempInt2);
- if (map == null)
- {
- failed = true;
- break;
- }
- failed = (!Compare(param[1], Envir.Objects.Count((
- d => d.CurrentMap == map &&
- d.Race == ObjectType.Monster &&
- string.Equals(d.Name.Replace(" ", ""), param[0], StringComparison.OrdinalIgnoreCase) &&
- !d.Dead)), tempInt));
- break;
- case CheckType.Random:
- if (!int.TryParse(param[0], out tempInt))
- {
- failed = true;
- break;
- }
- failed = 0 != Envir.Random.Next(0, tempInt);
- break;
- case CheckType.CheckCalc:
- int left;
- int right;
- if (!int.TryParse(param[0], out left) || !int.TryParse(param[2], out right))
- {
- failed = true;
- break;
- }
- try
- {
- failed = !Compare(param[1], left, right);
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[1], Key));
- return true;
- }
- break;
- }
- if (!failed) continue;
- Failed();
- return false;
- }
- Success();
- return true;
- }
- public bool Check(MonsterObject monster)
- {
- var failed = false;
- for (int i = 0; i < CheckList.Count; i++)
- {
- NPCChecks check = CheckList[i];
- List<string> param = check.Params.Select(t => FindVariable(monster, t)).ToList();
- for (int j = 0; j < param.Count; j++)
- {
- var parts = param[j].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
- if (parts.Length == 0) continue;
- foreach (var part in parts)
- {
- param[j] = param[j].Replace(part, ReplaceValue(monster, part));
- }
- }
- uint tempUint;
- int tempInt;
- int tempInt2;
- Map map;
- switch (check.Type)
- {
- case CheckType.Level:
- {
- if (!ushort.TryParse(param[1], out ushort level))
- {
- failed = true;
- break;
- }
- try
- {
- failed = !Compare(param[0], monster.Level, level);
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- }
- break;
- case CheckType.CheckDay:
- var day = Envir.Now.DayOfWeek.ToString().ToUpper();
- var dayToCheck = param[0].ToUpper();
- failed = day != dayToCheck;
- break;
- case CheckType.CheckHour:
- if (!uint.TryParse(param[0], out tempUint))
- {
- failed = true;
- break;
- }
- var hour = Envir.Now.Hour;
- var hourToCheck = tempUint;
- failed = hour != hourToCheck;
- break;
- case CheckType.CheckMinute:
- if (!uint.TryParse(param[0], out tempUint))
- {
- failed = true;
- break;
- }
- var minute = Envir.Now.Minute;
- var minuteToCheck = tempUint;
- failed = minute != minuteToCheck;
- break;
- case CheckType.CheckRange:
- int x, y, range;
- if (!int.TryParse(param[0], out x) || !int.TryParse(param[1], out y) || !int.TryParse(param[2], out range))
- {
- failed = true;
- break;
- }
- var target = new Point { X = x, Y = y };
- failed = !Functions.InRange(monster.CurrentLocation, target, range);
- break;
- case CheckType.CheckMap:
- map = Envir.GetMapByNameAndInstance(param[0]);
- failed = monster.CurrentMap != map;
- break;
- case CheckType.CheckMapLight:
- var monsterLight = Envir.Lights.ToString().ToUpperInvariant();
- var monsterCheck = param.Count > 0 ? param[0]?.Trim().ToUpperInvariant() : string.Empty;
- failed = string.IsNullOrEmpty(monsterCheck) || monsterLight != monsterCheck;
- break;
- case CheckType.CheckHum:
- if (!int.TryParse(param[1], out tempInt) || !int.TryParse(param[3], out tempInt2))
- {
- failed = true;
- break;
- }
- map = Envir.GetMapByNameAndInstance(param[2], tempInt2);
- if (map == null)
- {
- failed = true;
- break;
- }
- failed = !Compare(param[0], map.Players.Count(), tempInt);
- break;
- case CheckType.CheckMon:
- if (!int.TryParse(param[1], out tempInt) || !int.TryParse(param[3], out tempInt2))
- {
- failed = true;
- break;
- }
- map = Envir.GetMapByNameAndInstance(param[2], tempInt2);
- if (map == null)
- {
- failed = true;
- break;
- }
- failed = !Compare(param[0], map.MonsterCount, tempInt);
- break;
- case CheckType.CheckExactMon:
- if (Envir.GetMonsterInfo(param[0]) == null)
- {
- failed = true;
- break;
- }
- if (!int.TryParse(param[2], out tempInt) || !int.TryParse(param[4], out tempInt2))
- {
- failed = true;
- break;
- }
- map = Envir.GetMapByNameAndInstance(param[3], tempInt2);
- if (map == null)
- {
- failed = true;
- break;
- }
- failed = (!Compare(param[1], Envir.Objects.Count((
- d => d.CurrentMap == map &&
- d.Race == ObjectType.Monster &&
- string.Equals(d.Name.Replace(" ", ""), param[0], StringComparison.OrdinalIgnoreCase) &&
- !d.Dead)), tempInt));
- break;
- case CheckType.Random:
- if (!int.TryParse(param[0], out tempInt))
- {
- failed = true;
- break;
- }
- failed = 0 != Envir.Random.Next(0, tempInt);
- break;
- case CheckType.CheckCalc:
- int left;
- int right;
- if (!int.TryParse(param[0], out left) || !int.TryParse(param[2], out right))
- {
- failed = true;
- break;
- }
- try
- {
- failed = !Compare(param[1], left, right);
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[1], Key));
- return true;
- }
- break;
- }
- if (!failed) continue;
- Failed(monster);
- return false;
- }
- Success(monster);
- return true;
- }
- public bool Check(PlayerObject player)
- {
- var failed = false;
- for (int i = 0; i < CheckList.Count; i++)
- {
- NPCChecks check = CheckList[i];
- List<string> param = check.Params.Select(t => FindVariable(player, t)).ToList();
- for (int j = 0; j < param.Count; j++)
- {
- var parts = param[j].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
- if (parts.Length == 0) continue;
- foreach (var part in parts)
- {
- param[j] = param[j].Replace(part, ReplaceValue(player, part));
- }
- }
- uint tempUint;
- int tempInt;
- int tempInt2;
- switch (check.Type)
- {
- case CheckType.Level:
- {
- if (!ushort.TryParse(param[1], out ushort level))
- {
- failed = true;
- break;
- }
- try
- {
- failed = !Compare(param[0], player.Level, level);
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- }
- break;
- case CheckType.CheckGold:
- if (!uint.TryParse(param[1], out tempUint))
- {
- failed = true;
- break;
- }
- try
- {
- failed = !Compare(param[0], player.Account.Gold, tempUint);
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.CheckGuildGold:
- if (!uint.TryParse(param[1], out tempUint))
- {
- failed = true;
- break;
- }
- try
- {
- failed = !Compare(param[0], player.MyGuild.Gold, tempUint);
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.CheckCredit:
- if (!uint.TryParse(param[1], out tempUint))
- {
- failed = true;
- break;
- }
- try
- {
- failed = !Compare(param[0], player.Account.Credit, tempUint);
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.CheckItem:
- ushort count;
- ushort dura;
- if (!ushort.TryParse(param[1], out count))
- {
- failed = true;
- break;
- }
- bool checkDura = ushort.TryParse(param[2], out dura);
- var info = Envir.GetItemInfo(param[0]);
- foreach (var item in player.Info.Inventory.Where(item => item != null && item.Info == info))
- {
- if (checkDura)
- if (item.CurrentDura < (dura * 1000)) continue;
- if (count > item.Count)
- {
- count -= item.Count;
- continue;
- }
- if (count > item.Count) continue;
- count = 0;
- break;
- }
- if (count > 0)
- failed = true;
- break;
- case CheckType.CheckGender:
- MirGender gender;
- if (!MirGender.TryParse(param[0], false, out gender))
- {
- failed = true;
- break;
- }
- failed = player.Gender != gender;
- break;
- case CheckType.CheckClass:
- MirClass mirClass;
- if (!MirClass.TryParse(param[0], true, out mirClass))
- {
- failed = true;
- break;
- }
- failed = player.Class != mirClass;
- break;
- case CheckType.CheckDay:
- var day = Envir.Now.DayOfWeek.ToString().ToUpper();
- var dayToCheck = param[0].ToUpper();
- failed = day != dayToCheck;
- break;
- case CheckType.CheckHour:
- if (!uint.TryParse(param[0], out tempUint))
- {
- failed = true;
- break;
- }
- var hour = Envir.Now.Hour;
- var hourToCheck = tempUint;
- failed = hour != hourToCheck;
- break;
- case CheckType.CheckMinute:
- if (!uint.TryParse(param[0], out tempUint))
- {
- failed = true;
- break;
- }
- var minute = Envir.Now.Minute;
- var minuteToCheck = tempUint;
- failed = minute != minuteToCheck;
- break;
- case CheckType.CheckNameList:
- if (!File.Exists(param[0]))
- {
- failed = true;
- break;
- }
- var read = File.ReadAllLines(param[0]);
- failed = !read.Contains(player.Name);
- break;
- case CheckType.CheckGuildNameList:
- if (!File.Exists(param[0]))
- {
- failed = true;
- break;
- }
- read = File.ReadAllLines(param[0]);
- failed = player.MyGuild == null || !read.Contains(player.MyGuild.Name);
- break;
- case CheckType.IsAdmin:
- failed = !player.IsGM;
- break;
- case CheckType.CheckPkPoint:
- if (!int.TryParse(param[1], out tempInt))
- {
- failed = true;
- break;
- }
- try
- {
- failed = !Compare(param[0], player.PKPoints, tempInt);
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.CheckRange:
- int x, y, range;
- if (!int.TryParse(param[0], out x) || !int.TryParse(param[1], out y) || !int.TryParse(param[2], out range))
- {
- failed = true;
- break;
- }
- var target = new Point { X = x, Y = y };
- failed = !Functions.InRange(player.CurrentLocation, target, range);
- break;
- case CheckType.CheckMap:
- Map map = Envir.GetMapByNameAndInstance(param[0]);
- failed = player.CurrentMap != map;
- break;
- case CheckType.CheckMapLight:
- var playerLight = Envir.Lights.ToString().ToUpperInvariant();
- var playerCheck = param.Count > 0 ? param[0]?.Trim().ToUpperInvariant() : string.Empty;
- failed = string.IsNullOrEmpty(playerCheck) || playerLight != playerCheck;
- break;
- case CheckType.Check:
- uint onCheck;
- if (!uint.TryParse(param[0], out tempUint) || !uint.TryParse(param[1], out onCheck) || tempUint > Globals.FlagIndexCount)
- {
- failed = true;
- break;
- }
- bool tempBool = Convert.ToBoolean(onCheck);
- bool flag = player.Info.Flags[tempUint];
- failed = flag != tempBool;
- break;
- case CheckType.CheckHum:
- if (!int.TryParse(param[1], out tempInt) || !int.TryParse(param[3], out tempInt2))
- {
- failed = true;
- break;
- }
- map = Envir.GetMapByNameAndInstance(param[2], tempInt2);
- if (map == null)
- {
- failed = true;
- break;
- }
- failed = !Compare(param[0], map.Players.Count(), tempInt);
- break;
- case CheckType.CheckMon:
- if (!int.TryParse(param[1], out tempInt) || !int.TryParse(param[3], out tempInt2))
- {
- failed = true;
- break;
- }
- map = Envir.GetMapByNameAndInstance(param[2], tempInt2);
- if (map == null)
- {
- failed = true;
- break;
- }
- failed = !Compare(param[0], map.MonsterCount, tempInt);
- break;
- case CheckType.CheckExactMon:
- if (Envir.GetMonsterInfo(param[0]) == null)
- {
- failed = true;
- break;
- }
- if (!int.TryParse(param[2], out tempInt) || !int.TryParse(param[4], out tempInt2))
- {
- failed = true;
- break;
- }
- map = Envir.GetMapByNameAndInstance(param[3], tempInt2);
- if (map == null)
- {
- failed = true;
- break;
- }
- failed = (!Compare(param[1], Envir.Objects.Count((
- d => d.CurrentMap == map &&
- d.Race == ObjectType.Monster &&
- string.Equals(d.Name.Replace(" ", ""), param[0], StringComparison.OrdinalIgnoreCase) &&
- !d.Dead)), tempInt));
- break;
- case CheckType.Random:
- if (!int.TryParse(param[0], out tempInt))
- {
- failed = true;
- break;
- }
- failed = 0 != Envir.Random.Next(0, tempInt);
- break;
- case CheckType.Groupleader:
- failed = (player.GroupMembers == null || player.GroupMembers[0] != player);
- break;
- case CheckType.GroupCount:
- if (!int.TryParse(param[1], out tempInt))
- {
- failed = true;
- break;
- }
- failed = (player.GroupMembers == null || !Compare(param[0], player.GroupMembers.Count, tempInt));
- break;
- case CheckType.GroupCheckNearby:
- target = new Point(-1, -1);
- for (int j = 0; j < player.CurrentMap.NPCs.Count; j++)
- {
- NPCObject ob = player.CurrentMap.NPCs[j];
- if (ob.ObjectID != player.NPCObjectID) continue;
- target = ob.CurrentLocation;
- break;
- }
- if (target.X == -1)
- {
- failed = true;
- break;
- }
- if (player.GroupMembers == null)
- failed = true;
- else
- {
- for (int j = 0; j < player.GroupMembers.Count; j++)
- {
- if (player.GroupMembers[j] == null) continue;
- failed |= !Functions.InRange(player.GroupMembers[j].CurrentLocation, target, 9);
- if (failed) break;
- }
- }
- break;
- case CheckType.PetCount:
- if (!int.TryParse(param[1], out tempInt))
- {
- failed = true;
- break;
- }
- failed = !Compare(param[0], player.Pets.Count(), tempInt);
- break;
- case CheckType.PetLevel:
- if (!int.TryParse(param[1], out tempInt))
- {
- failed = true;
- break;
- }
- for (int p = 0; p < player.Pets.Count(); p++)
- {
- failed = !Compare(param[0], player.Pets[p].PetLevel, tempInt);
- }
- break;
- case CheckType.CheckCalc:
- int left;
- int right;
- try
- {
- if (!int.TryParse(param[0], out left) || !int.TryParse(param[2], out right))
- {
- failed = !Compare(param[1], param[0], param[2]);
- }
- else
- {
- failed = !Compare(param[1], left, right);
- }
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[1], Key));
- return true;
- }
- break;
- case CheckType.InGuild:
- if (param[0].Length > 0)
- {
- failed = player.MyGuild == null || player.MyGuild.Name != param[0];
- break;
- }
- failed = player.MyGuild == null;
- break;
- case CheckType.CheckQuest:
- if (!int.TryParse(param[0], out tempInt))
- {
- failed = true;
- break;
- }
- string tempString = param[1].ToUpper();
- if (tempString == "ACTIVE")
- {
- failed = !player.CurrentQuests.Any(e => e.Index == tempInt);
- }
- else //COMPLETE
- {
- failed = !player.CompletedQuests.Contains(tempInt);
- }
- break;
- case CheckType.CheckRelationship:
- if (player.Info.Married == 0)
- {
- failed = true;
- }
- break;
- case CheckType.CheckWeddingRing:
- failed = !player.CheckMakeWeddingRing();
- break;
- case CheckType.CheckPet:
- bool petMatch = false;
- for (int c = player.Pets.Count - 1; c >= 0; c--)
- {
- if (string.Compare(player.Pets[c].Info.Name, param[0], true) != 0) continue;
- petMatch = true;
- }
- failed = !petMatch;
- break;
- case CheckType.HasBagSpace:
- if (!int.TryParse(param[1], out tempInt))
- {
- failed = true;
- break;
- }
- int slotCount = 0;
- for (int k = 0; k < player.Info.Inventory.Length; k++)
- if (player.Info.Inventory[k] == null) slotCount++;
- failed = !Compare(param[0], slotCount, tempInt);
- break;
- case CheckType.IsNewHuman:
- failed = player.Info.AccountInfo.Characters.Count > 1;
- break;
- case CheckType.CheckConquest:
- if (!int.TryParse(param[0], out tempInt))
- {
- failed = true;
- break;
- }
- try
- {
- ConquestObject Conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (Conquest == null)
- {
- failed = true;
- break;
- }
- failed = Conquest.WarIsOn;
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.AffordGuard:
- if (!int.TryParse(param[0], out tempInt) || !int.TryParse(param[1], out tempInt2))
- {
- failed = true;
- break;
- }
- try
- {
- ConquestObject Conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (Conquest == null)
- {
- failed = true;
- break;
- }
- ConquestGuildArcherInfo Archer = Conquest.ArcherList.FirstOrDefault(g => g.Info.Index == tempInt2);
- if (Archer == null || Archer.GetRepairCost() == 0)
- {
- failed = true;
- break;
- }
- if (player.MyGuild != null)
- failed = (player.MyGuild.Gold < Archer.GetRepairCost());
- else
- failed = true;
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.AffordGate:
- if (!int.TryParse(param[0], out tempInt) || !int.TryParse(param[1], out tempInt2))
- {
- failed = true;
- break;
- }
- try
- {
- ConquestObject Conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (Conquest == null)
- {
- failed = true;
- break;
- }
- ConquestGuildGateInfo Gate = Conquest.GateList.FirstOrDefault(f => f.Info.Index == tempInt2);
- if (Gate == null || Gate.GetRepairCost() == 0)
- {
- failed = true;
- break;
- }
- if (player.MyGuild != null)
- failed = (player.MyGuild.Gold < Gate.GetRepairCost());
- else
- failed = true;
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.AffordWall:
- if (!int.TryParse(param[0], out tempInt) || !int.TryParse(param[1], out tempInt2))
- {
- failed = true;
- break;
- }
- try
- {
- ConquestObject Conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (Conquest == null)
- {
- failed = true;
- break;
- }
- ConquestGuildWallInfo Wall = Conquest.WallList.FirstOrDefault(h => h.Info.Index == tempInt2);
- if (Wall == null || Wall.GetRepairCost() == 0)
- {
- failed = true;
- break;
- }
- if (player.MyGuild != null)
- failed = (player.MyGuild.Gold < Wall.GetRepairCost());
- else
- failed = true;
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.AffordSiege:
- if (!int.TryParse(param[0], out tempInt) || !int.TryParse(param[1], out tempInt2))
- {
- failed = true;
- break;
- }
- try
- {
- ConquestObject Conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (Conquest == null)
- {
- failed = true;
- break;
- }
- ConquestGuildGateInfo Gate = Conquest.GateList.FirstOrDefault(f => f.Info.Index == tempInt2);
- if (Gate == null || Gate.GetRepairCost() == 0)
- {
- failed = true;
- break;
- }
- if (player.MyGuild != null)
- failed = (player.MyGuild.Gold < Gate.GetRepairCost());
- else
- failed = true;
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.CheckPermission:
- GuildRankOptions guildPermissions;
- if (!Enum.TryParse(param[0], true, out guildPermissions))
- {
- failed = true;
- break;
- }
- if (player.MyGuild == null)
- {
- failed = true;
- break;
- }
- failed = !(player.MyGuildRank.Options.HasFlag(guildPermissions));
- break;
- case CheckType.ConquestAvailable:
- if (!int.TryParse(param[0], out tempInt))
- {
- failed = true;
- break;
- }
- try
- {
- ConquestObject Conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (Conquest == null)
- {
- failed = true;
- break;
- }
- if (player.MyGuild != null)
- failed = (Conquest.GuildInfo.AttackerID != -1);
- else
- failed = true;
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.ConquestOwner:
- if (!int.TryParse(param[0], out tempInt))
- {
- failed = true;
- break;
- }
- try
- {
- ConquestObject Conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (Conquest == null)
- {
- failed = true;
- break;
- }
- if (player.MyGuild != null && player.MyGuild.Guildindex == Conquest.GuildInfo.Owner)
- failed = false;
- else
- failed = true;
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- break;
- case CheckType.CheckTimer:
- {
- if (!long.TryParse(param[1], out long time))
- {
- failed = true;
- break;
- }
- try
- {
- var globalTimerKey = "_-" + param[0];
- Timer timer;
- if (Envir.Timers.ContainsKey(globalTimerKey))
- {
- timer = Envir.Timers[globalTimerKey];
- }
- else
- {
- timer = player.GetTimer(param[0]);
- }
- long remainingTime = 0;
- if (timer != null)
- {
- remainingTime = (timer.RelativeTime - Envir.Time) / 1000;
- break;
- }
- failed = !Compare(param[0], remainingTime, time);
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[0], Key));
- return true;
- }
- }
- break;
- case CheckType.HeroLevel:
- if (!int.TryParse(param[1], out tempInt))
- {
- failed = true;
- break;
- }
- if (player.CurrentHero == null)
- {
- failed = true;
- }
- else
- {
- failed = !Compare(param[0], player.CurrentHero.Level, tempInt);
- }
- break;
- case CheckType.CheckHeroClass:
- MirClass heroClass;
- if (!MirClass.TryParse(param[0], true, out heroClass))
- {
- failed = true;
- break;
- }
- if (player.CurrentHero == null)
- {
- failed = true;
- }
- else
- {
- failed = player.CurrentHero.Class != heroClass;
- }
- break;
- case CheckType.CheckHeroGender:
- MirGender heroGender;
- if (!MirGender.TryParse(param[0], false, out heroGender))
- {
- failed = true;
- break;
- }
- if (player.CurrentHero == null)
- {
- failed = true;
- }
- else
- {
- failed = player.CurrentHero.Gender != heroGender;
- }
- break;
- case CheckType.CheckHeroItem:
- ushort heroItemCount;
- ushort heroItemDura;
- if (!ushort.TryParse(param[1], out heroItemCount))
- {
- failed = true;
- break;
- }
- bool heroCheckDura = ushort.TryParse(param[2], out heroItemDura);
- var heroItemInfo = Envir.GetItemInfo(param[0]);
- if (player.CurrentHero == null || player.CurrentHero.Inventory == null)
- {
- failed = true;
- break;
- }
- foreach (var item in player.CurrentHero.Inventory.Where(item => item != null && item.Info == heroItemInfo))
- {
- if (heroCheckDura)
- if (item.CurrentDura < (heroItemDura * 1000)) continue;
- if (heroItemCount > item.Count)
- {
- heroItemCount -= item.Count;
- continue;
- }
- heroItemCount = 0;
- break;
- }
- if (heroItemCount > 0)
- failed = true;
- break;
- case CheckType.CheckBuff:
- {
- if (!Enum.TryParse(param[0], true, out BuffType buffType))
- {
- failed = true;
- break;
- }
- failed = !player.HasBuff(buffType);
- }
- break;
- }
- if (!failed) continue;
- Failed(player);
- return false;
- }
- Success(player);
- return true;
- }
- private void Act(IList<NPCActions> acts)
- {
- for (var i = 0; i < acts.Count; i++)
- {
- string tempString = string.Empty;
- int tempInt;
- byte tempByte;
- Packet p;
- MonsterInfo monInfo;
- NPCActions act = acts[i];
- List<string> param = act.Params.ToList();
- Map map;
- ChatType chatType;
- switch (act.Type)
- {
- case ActionType.ClearNameList:
- tempString = param[0];
- File.WriteAllLines(tempString, new string[] { });
- break;
- case ActionType.GlobalMessage:
- if (!Enum.TryParse(param[1], true, out chatType)) return;
- p = new S.Chat { Message = param[0], Type = chatType };
- Envir.Broadcast(p);
- break;
- case ActionType.Break:
- Page.BreakFromSegments = true;
- break;
- case ActionType.Param1:
- if (!int.TryParse(param[1], out tempInt)) return;
- Param1 = param[0];
- Param1Instance = tempInt;
- break;
- case ActionType.Param2:
- if (!int.TryParse(param[0], out tempInt)) return;
- Param2 = tempInt;
- break;
- case ActionType.Param3:
- if (!int.TryParse(param[0], out tempInt)) return;
- Param3 = tempInt;
- break;
- case ActionType.Mongen:
- if (Param1 == null || Param2 == 0 || Param3 == 0) return;
- if (!byte.TryParse(param[1], out tempByte)) return;
- map = Envir.GetMapByNameAndInstance(Param1, Param1Instance);
- if (map == null) return;
- monInfo = Envir.GetMonsterInfo(param[0]);
- if (monInfo == null) return;
- for (int j = 0; j < tempByte; j++)
- {
- MonsterObject monster = MonsterObject.GetMonster(monInfo);
- if (monster == null) return;
- monster.Direction = 0;
- monster.ActionTime = Envir.Time + 1000;
- monster.Spawn(map, new Point(Param2, Param3));
- }
- break;
- case ActionType.MonClear:
- if (!int.TryParse(param[1], out tempInt)) return;
- map = Envir.GetMapByNameAndInstance(param[0], tempInt);
- if (map == null) return;
- foreach (var cell in map.Cells)
- {
- if (cell == null || cell.Objects == null) continue;
- for (int j = 0; j < cell.Objects.Count(); j++)
- {
- MapObject ob = cell.Objects[j];
- if (ob.Race != ObjectType.Monster) continue;
- if (ob.Dead) continue;
- ob.Die();
- }
- }
- break;
- }
- }
- }
- private void Act(IList<NPCActions> acts, PlayerObject player)
- {
- MailInfo mailInfo = null;
- for (var i = 0; i < acts.Count; i++)
- {
- NPCActions act = acts[i];
- List<string> param = act.Params.Select(t => FindVariable(player, t)).ToList();
- for (int j = 0; j < param.Count; j++)
- {
- var parts = param[j].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
- if (parts.Length == 0) continue;
- foreach (var part in parts)
- {
- param[j] = param[j].Replace(part, ReplaceValue(player, part));
- }
- if (player.NPCData.TryGetValue("NPCInputStr", out object _npcInputStr))
- {
- param[j] = param[j].Replace("%INPUTSTR", (string)_npcInputStr);
- }
- }
- switch (act.Type)
- {
- case ActionType.Move:
- {
- Map targetmap = Envir.GetMapByNameAndInstance(param[0]);
- if (targetmap == null) return;
- if (!int.TryParse(param[1], out int x)) return;
- if (!int.TryParse(param[2], out int y)) return;
- var coords = new Point(x, y);
- if (coords.X > 0 && coords.Y > 0) player.Teleport(targetmap, coords);
- else player.TeleportRandom(200, 0, targetmap);
- }
- break;
- case ActionType.InstanceMove:
- {
- if (!int.TryParse(param[1], out int instanceId)) return;
- if (!int.TryParse(param[2], out int x)) return;
- if (!int.TryParse(param[3], out int y)) return;
- var targetmap = Envir.GetMapByNameAndInstance(param[0], instanceId);
- if (targetmap == null) return;
- player.Teleport(targetmap, new Point(x, y));
- }
- break;
- case ActionType.BuyGT:
- if (player.MyGuild == null || player.MyGuildRank == null) return;
- if (player.MyGuildRank != player.MyGuild.Ranks[0])
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouNeedGuildLeader), ChatType.System);
- return;
- }
- if (player.MyGuild.Gold < Settings.BuyGTGold)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.GuildFundsInsufficient), ChatType.System);
- return;
- }
- if (player.MyGuild.HasGT)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouAlreadyOwnGuildTerritory), ChatType.System);
- return;
- }
- GTMap GTmap = null;
- foreach (var gt in Envir.GTMapList)
- {
- if (gt.Owner == "None")
- {
- GTmap = gt;
- break;
- }
- }
- if (GTmap == null)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoGuildTerritoryAvailable), ChatType.System);
- return;
- }
- player.MyGuild.Gold -= (uint)Settings.BuyGTGold;
- player.MyGuild.SendServerPacket(new S.GuildStorageGoldChange() { Type = 2, Amount = (uint)Settings.BuyGTGold });
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouRentedGuildTerritory), ChatType.System);
- player.MyGuild.GTIndex = GTmap.Index;
- player.MyGuild.GTRent = DateTime.Now.AddDays(Settings.GTDays);
- player.MyGuild.GTKey = Envir.Random.Next(100, int.MaxValue - 100);
- player.MyGuild.GTPrice = 0;
- GTmap.Owner = player.MyGuild.Name;
- GTmap.Leader = player.MyGuild.Ranks[0].Members[0].Name;
- if (player.MyGuild.Ranks[0].Members.Count > 1)
- GTmap.Leader = player.MyGuild.Ranks[0].Members[1].Name;
- GTmap.Price = 0;
- GTmap.Key = player.MyGuild.GTKey;
- break;
- case ActionType.TeleportGT:
- if (player.MyGuild == null)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouNeedGuild), ChatType.System);
- return;
- }
- if (!player.MyGuild.HasGT)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouDontOwnGuildTerritory), ChatType.System);
- return;
- }
- GTmap = null;
- foreach (var gt in Envir.GTMapList)
- {
- if (gt.Index == player.MyGuild.GTIndex)
- {
- GTmap = gt;
- break;
- }
- }
- if (GTmap == null)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoGTFoundContactGM), ChatType.System);
- return;
- }
- if (!(GTmap.Maps.Count > 0))
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoGTMapsContactGM), ChatType.System);
- return;
- }
- if (player.MyGuild.GTBegin > Envir.Now)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.RecentSalePending), ChatType.System);
- return;
- }
- var map = GTmap.Maps[0];
- if (map == null || map.Info.SafeZones == null || map.Info.SafeZones.Count == 0)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoSafezoneContactGM), ChatType.System);
- return;
- }
- player.Teleport(map, map.Info.SafeZones[0].Location);
- break;
- case ActionType.ExtendGT:
- if (player.MyGuild == null || player.MyGuildRank == null) return;
- if (player.MyGuildRank != player.MyGuild.Ranks[0])
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouNeedGuildLeader), ChatType.System);
- return;
- }
- if (player.MyGuild.Gold < Settings.ExtendGT)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.InsufficientFunds), ChatType.System);
- return;
- }
- GTmap = null;
- foreach (var gt in Envir.GTMapList)
- {
- if (gt.Owner == player.MyGuild.Name)
- {
- GTmap = gt;
- break;
- }
- }
- if (GTmap == null)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouDontOwnGT), ChatType.System);
- return;
- }
- player.MyGuild.Gold -= (uint)Settings.ExtendGT;
- player.MyGuild.SendServerPacket(new S.GuildStorageGoldChange() { Type = 2, Amount = (uint)Settings.ExtendGT });
- player.MyGuild.GTRent = player.MyGuild.GTRent.AddDays(Settings.GTDays);
- GTmap.Price = 10000000;
- break;
- case ActionType.GiveGold:
- {
- if (!uint.TryParse(param[0], out uint gold)) return;
- if (gold + player.Account.Gold >= uint.MaxValue)
- gold = uint.MaxValue - player.Account.Gold;
- player.GainGold(gold);
- }
- break;
- case ActionType.TakeGold:
- {
- if (!uint.TryParse(param[0], out uint gold)) return;
- if (gold >= player.Account.Gold) gold = player.Account.Gold;
- player.Account.Gold -= gold;
- player.Enqueue(new S.LoseGold { Gold = gold });
- }
- break;
- case ActionType.GiveGuildGold:
- {
- if (!uint.TryParse(param[0], out uint gold)) return;
- if (gold + player.MyGuild.Gold >= uint.MaxValue)
- gold = uint.MaxValue - player.MyGuild.Gold;
- player.MyGuild.Gold += gold;
- player.MyGuild.SendServerPacket(new S.GuildStorageGoldChange() { Type = 3, Amount = gold });
- }
- break;
- case ActionType.TakeGuildGold:
- {
- if (!uint.TryParse(param[0], out uint gold)) return;
- if (gold >= player.MyGuild.Gold) gold = player.MyGuild.Gold;
- player.MyGuild.Gold -= gold;
- player.MyGuild.SendServerPacket(new S.GuildStorageGoldChange() { Type = 2, Amount = gold });
- }
- break;
- case ActionType.GiveCredit:
- {
- if (!uint.TryParse(param[0], out uint credit)) return;
- if (credit + player.Account.Credit >= uint.MaxValue)
- credit = uint.MaxValue - player.Account.Credit;
- player.GainCredit(credit);
- }
- break;
- case ActionType.TakeCredit:
- {
- if (!uint.TryParse(param[0], out uint credit)) return;
- if (credit >= player.Account.Credit) credit = player.Account.Credit;
- player.Account.Credit -= credit;
- player.Enqueue(new S.LoseCredit { Credit = credit });
- }
- break;
- case ActionType.GivePearls:
- {
- if (!uint.TryParse(param[0], out uint pearls)) return;
- if (pearls + player.Info.PearlCount >= int.MaxValue)
- pearls = (uint)(int.MaxValue - player.Info.PearlCount);
- player.IntelligentCreatureGainPearls((int)pearls);
- }
- break;
- case ActionType.TakePearls:
- {
- if (!uint.TryParse(param[0], out uint pearls)) return;
- if (pearls >= player.Info.PearlCount) pearls = (uint)player.Info.PearlCount;
- player.IntelligentCreatureLosePearls((int)pearls);
- }
- break;
- case ActionType.GiveItem:
- {
- if (param.Count < 2 || !ushort.TryParse(param[1], out ushort count)) count = 1;
- var info = Envir.GetItemInfo(param[0]);
- if (info == null)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.FailedToGetItemInfoPage), param[0], Key));
- break;
- }
- while (count > 0)
- {
- UserItem item = Envir.CreateFreshItem(info);
- if (item == null)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.FailedCreateUserItemPage), param[0], Key));
- return;
- }
- if (item.Info.StackSize > count)
- {
- item.Count = count;
- count = 0;
- }
- else
- {
- count -= item.Info.StackSize;
- item.Count = item.Info.StackSize;
- }
- if (player.CanGainItem(item))
- player.GainItem(item);
- }
- }
- break;
- case ActionType.TakeItem:
- {
- if (param.Count < 2 || !ushort.TryParse(param[1], out ushort count)) count = 1;
- var info = Envir.GetItemInfo(param[0]);
- ushort dura;
- bool checkDura = ushort.TryParse(param[2], out dura);
- if (info == null)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.FailedGetItemInfo), param[0], Key));
- break;
- }
- for (int j = 0; j < player.Info.Inventory.Length; j++)
- {
- UserItem item = player.Info.Inventory[j];
- if (item == null) continue;
- if (item.Info != info) continue;
- if (checkDura)
- {
- if (item.CurrentDura < (dura * 1000)) continue;
- }
- if (count > item.Count)
- {
- player.Enqueue(new S.DeleteItem { UniqueID = item.UniqueID, Count = item.Count });
- player.Info.Inventory[j] = null;
- count -= item.Count;
- continue;
- }
- player.Enqueue(new S.DeleteItem { UniqueID = item.UniqueID, Count = count });
- if (count == item.Count)
- player.Info.Inventory[j] = null;
- else
- item.Count -= count;
- break;
- }
- player.RefreshStats();
- }
- break;
- case ActionType.GiveExp:
- {
- uint tempUint;
- if (!uint.TryParse(param[0], out tempUint)) return;
- player.GainExp(tempUint);
- }
- break;
- case ActionType.GivePet:
- {
- byte petcount = 0;
- byte petlevel = 0;
- var monInfo = Envir.GetMonsterInfo(param[0]);
- if (monInfo == null) return;
- if (param.Count > 1)
- petcount = byte.TryParse(param[1], out petcount) ? Math.Min((byte)5, petcount) : (byte)1;
- if (param.Count > 2)
- petlevel = byte.TryParse(param[2], out petlevel) ? Math.Min((byte)7, petlevel) : (byte)0;
- for (int j = 0; j < petcount; j++)
- {
- MonsterObject monster = MonsterObject.GetMonster(monInfo);
- if (monster == null) return;
- monster.PetLevel = petlevel;
- monster.Master = player;
- monster.MaxPetLevel = 7;
- monster.Direction = player.Direction;
- monster.ActionTime = Envir.Time + 1000;
- monster.Spawn(player.CurrentMap, player.CurrentLocation);
- player.Pets.Add(monster);
- }
- }
- break;
- case ActionType.RemovePet:
- {
- for (int c = player.Pets.Count - 1; c >= 0; c--)
- {
- if (string.Compare(player.Pets[c].Info.Name, param[0], true) != 0) continue;
- player.Pets[c].Die();
- }
- }
- break;
- case ActionType.ClearPets:
- {
- for (int c = player.Pets.Count - 1; c >= 0; c--)
- {
- player.Pets[c].DieNextTurn = true;
- }
- }
- break;
- case ActionType.AddNameList:
- {
- var tempString = param[0];
- if (File.ReadAllLines(tempString).All(t => player.Name != t))
- {
- using (var line = File.AppendText(tempString))
- {
- line.WriteLine(player.Name);
- }
- }
- }
- break;
- case ActionType.AddGuildNameList:
- {
- var tempString = param[0];
- if (player.MyGuild == null) break;
- if (File.ReadAllLines(tempString).All(t => player.MyGuild.Name != t))
- {
- using (var line = File.AppendText(tempString))
- {
- line.WriteLine(player.MyGuild.Name);
- }
- }
- }
- break;
- case ActionType.DelNameList:
- {
- var tempString = param[0];
- File.WriteAllLines(tempString, File.ReadLines(tempString).Where(l => l != player.Name).ToList());
- }
- break;
- case ActionType.DelGuildNameList:
- {
- if (player.MyGuild == null) break;
- var tempString = param[0];
- File.WriteAllLines(tempString, File.ReadLines(tempString).Where(l => l != player.MyGuild.Name).ToList());
- }
- break;
- case ActionType.ClearNameList:
- {
- var tempString = param[0];
- File.WriteAllLines(tempString, new string[] { });
- }
- break;
- case ActionType.ClearGuildNameList:
- {
- if (player.MyGuild == null) break;
- var tempString = param[0];
- File.WriteAllLines(tempString, new string[] { });
- }
- break;
- case ActionType.GiveHP:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- player.ChangeHP(tempInt);
- }
- break;
- case ActionType.GiveMP:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- player.ChangeMP(tempInt);
- }
- break;
- case ActionType.ChangeLevel:
- {
- if (!ushort.TryParse(param[0], out ushort tempuShort)) return;
- tempuShort = Math.Min(ushort.MaxValue, tempuShort);
- player.Level = tempuShort;
- player.Experience = 0;
- player.LevelUp();
- }
- break;
- case ActionType.SetPkPoint:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- player.PKPoints = tempInt;
- }
- break;
- case ActionType.ReducePkPoint:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- player.PKPoints -= tempInt;
- if (player.PKPoints < 0) player.PKPoints = 0;
- }
- break;
- case ActionType.IncreasePkPoint:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- player.PKPoints += tempInt;
- }
- break;
- case ActionType.ChangeGender:
- {
- switch (player.Info.Gender)
- {
- case MirGender.Male:
- player.Info.Gender = MirGender.Female;
- break;
- case MirGender.Female:
- player.Info.Gender = MirGender.Male;
- break;
- }
- }
- break;
- case ActionType.ChangeHair:
- {
- if (param.Count < 1)
- {
- player.Info.Hair = (byte)Envir.Random.Next(0, 9);
- }
- else
- {
- byte.TryParse(param[0], out byte tempByte);
- if (tempByte >= 0 && tempByte <= 9)
- {
- player.Info.Hair = tempByte;
- }
- }
- }
- break;
- case ActionType.ChangeClass:
- {
- if (!Enum.TryParse(param[0], true, out MirClass mirClass)) return;
- switch (mirClass)
- {
- case MirClass.Warrior:
- player.Info.Class = MirClass.Warrior;
- break;
- case MirClass.Taoist:
- player.Info.Class = MirClass.Taoist;
- break;
- case MirClass.Wizard:
- player.Info.Class = MirClass.Wizard;
- break;
- case MirClass.Assassin:
- player.Info.Class = MirClass.Assassin;
- break;
- case MirClass.Archer:
- player.Info.Class = MirClass.Archer;
- break;
- }
- }
- break;
- case ActionType.LocalMessage:
- {
- ChatType chatType;
- if (!Enum.TryParse(param[1], true, out chatType)) return;
- player.ReceiveChat(param[0], chatType);
- }
- break;
- case ActionType.GlobalMessage:
- {
- if (!Enum.TryParse(param[1], true, out ChatType chatType)) return;
- var p = new S.Chat { Message = param[0], Type = chatType };
- Envir.Broadcast(p);
- }
- break;
- case ActionType.GiveSkill:
- {
- byte spellLevel = 0;
- Spell skill;
- if (!Enum.TryParse(param[0], true, out skill)) return;
- if (player.Info.Magics.Any(e => e.Spell == skill)) break;
- if (param.Count > 1)
- spellLevel = byte.TryParse(param[1], out spellLevel) ? Math.Min((byte)3, spellLevel) : (byte)0;
- var magic = new UserMagic(skill) { Level = spellLevel };
- if (magic.Info == null) return;
- player.Info.Magics.Add(magic);
- player.SendMagicInfo(magic);
- }
- break;
- case ActionType.RemoveSkill:
- {
- if (!Enum.TryParse(param[0], true, out Spell skill)) return;
- if (!player.Info.Magics.Any(e => e.Spell == skill)) break;
- for (var j = player.Info.Magics.Count - 1; j >= 0; j--)
- {
- if (player.Info.Magics[j].Spell != skill) continue;
- player.Info.Magics.RemoveAt(j);
- player.Enqueue(new S.RemoveMagic { PlaceId = j });
- }
- }
- break;
- case ActionType.Goto:
- {
- DelayedAction action = new DelayedAction(DelayedType.NPC, -1, player.NPCObjectID, player.NPCScriptID, "[" + param[0] + "]");
- player.ActionList.Add(action);
- }
- break;
- case ActionType.Call:
- {
- if (!int.TryParse(param[0], out int scriptID)) return;
- var action = new DelayedAction(DelayedType.NPC, -1, player.NPCObjectID, scriptID, "[@MAIN]");
- player.ActionList.Add(action);
- }
- break;
- case ActionType.Break:
- {
- Page.BreakFromSegments = true;
- }
- break;
- case ActionType.Set:
- {
- int flagIndex;
- uint onCheck;
- if (!int.TryParse(param[0], out flagIndex)) return;
- if (!uint.TryParse(param[1], out onCheck)) return;
- if (flagIndex < 0 || flagIndex >= Globals.FlagIndexCount) return;
- var flagIsOn = Convert.ToBoolean(onCheck);
- player.Info.Flags[flagIndex] = flagIsOn;
- for (int f = player.CurrentMap.NPCs.Count - 1; f >= 0; f--)
- {
- if (Functions.InRange(player.CurrentMap.NPCs[f].CurrentLocation, player.CurrentLocation, Globals.DataRange))
- player.CurrentMap.NPCs[f].CheckVisible(player);
- }
- if (flagIsOn) player.CheckNeedQuestFlag(flagIndex);
- }
- break;
- case ActionType.Param1:
- {
- if (!int.TryParse(param[1], out int tempInt)) return;
- Param1 = param[0];
- Param1Instance = tempInt;
- }
- break;
- case ActionType.Param2:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- Param2 = tempInt;
- }
- break;
- case ActionType.Param3:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- Param3 = tempInt;
- }
- break;
- case ActionType.Mongen:
- {
- if (Param1 == null || Param2 == 0 || Param3 == 0) return;
- if (!byte.TryParse(param[1], out byte tempByte)) return;
- Map targetmap = Envir.GetMapByNameAndInstance(Param1, Param1Instance);
- if (targetmap == null) return;
- var monInfo = Envir.GetMonsterInfo(param[0]);
- if (monInfo == null) return;
- for (int j = 0; j < tempByte; j++)
- {
- MonsterObject monster = MonsterObject.GetMonster(monInfo);
- if (monster == null) return;
- monster.Direction = 0;
- monster.ActionTime = Envir.Time + 1000;
- monster.Spawn(targetmap, new Point(Param2, Param3));
- }
- }
- break;
- case ActionType.TimeRecall:
- {
- var tempString = "";
- if (!long.TryParse(param[0], out long tempLong)) return;
- if (param[1].Length > 0) tempString = "[" + param[1] + "]";
- Map tempMap = player.CurrentMap;
- Point tempPoint = player.CurrentLocation;
- var action = new DelayedAction(DelayedType.NPC, Envir.Time + (tempLong * 1000), player.NPCObjectID, player.NPCScriptID, tempString, tempMap, tempPoint);
- player.ActionList.Add(action);
- }
- break;
- case ActionType.TimeRecallGroup:
- {
- var tempString = "";
- if (player.GroupMembers == null) return;
- if (!long.TryParse(param[0], out long tempLong)) return;
- if (param[1].Length > 0) tempString = "[" + param[1] + "]";
- for (int j = 0; j < player.GroupMembers.Count(); j++)
- {
- var groupMember = player.GroupMembers[j];
- var action = new DelayedAction(DelayedType.NPC, Envir.Time + (tempLong * 1000), player.NPCObjectID, player.NPCScriptID, tempString, player.CurrentMap, player.CurrentLocation);
- groupMember.ActionList.Add(action);
- }
- }
- break;
- case ActionType.BreakTimeRecall:
- {
- foreach (DelayedAction ac in player.ActionList.Where(u => u.Type == DelayedType.NPC))
- {
- ac.FlaggedToRemove = true;
- }
- }
- break;
- case ActionType.DelayGoto:
- {
- if (!long.TryParse(param[0], out long tempLong)) return;
- var action = new DelayedAction(DelayedType.NPC, Envir.Time + (tempLong * 1000), player.NPCObjectID, player.NPCScriptID, "[" + param[1] + "]");
- player.ActionList.Add(action);
- }
- break;
- case ActionType.MonClear:
- {
- if (!int.TryParse(param[1], out int tempInt)) return;
- var targetmap = Envir.GetMapByNameAndInstance(param[0], tempInt);
- if (targetmap == null) return;
- foreach (var cell in targetmap.Cells)
- {
- if (cell == null || cell.Objects == null) continue;
- for (int j = 0; j < cell.Objects.Count(); j++)
- {
- MapObject ob = cell.Objects[j];
- if (ob.Race != ObjectType.Monster) continue;
- if (ob.Dead) continue;
- if (!string.IsNullOrEmpty(param[2]) && string.Compare(param[2], ((MonsterObject)ob).Info.Name, true) != 0)
- continue;
- ob.Die();
- }
- }
- }
- break;
- case ActionType.GroupRecall:
- {
- if (player.GroupMembers == null) return;
- for (int j = 0; j < player.GroupMembers.Count(); j++)
- {
- player.GroupMembers[j].Teleport(player.CurrentMap, player.CurrentLocation);
- }
- }
- break;
- case ActionType.GroupTeleport:
- {
- if (player.GroupMembers == null) return;
- if (!int.TryParse(param[1], out int tempInt)) return;
- if (!int.TryParse(param[2], out int x)) return;
- if (!int.TryParse(param[3], out int y)) return;
- var targetmap = Envir.GetMapByNameAndInstance(param[0], tempInt);
- if (targetmap == null) return;
- for (int j = 0; j < player.GroupMembers.Count(); j++)
- {
- if (x == 0 || y == 0)
- {
- player.GroupMembers[j].TeleportRandom(200, 0, targetmap);
- }
- else
- {
- player.GroupMembers[j].Teleport(targetmap, new Point(x, y));
- }
- }
- }
- break;
- case ActionType.Mov:
- {
- string value = param[0];
- AddVariable(player, value, param[1]);
- }
- break;
- case ActionType.Calc:
- {
- int left;
- int right;
- bool resultLeft = int.TryParse(param[0], out left);
- bool resultRight = int.TryParse(param[2], out right);
- if (resultLeft && resultRight)
- {
- try
- {
- int result = Calculate(param[1], left, right);
- AddVariable(player, param[3].Replace("-", ""), result.ToString());
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[1], Key));
- }
- }
- else
- {
- AddVariable(player, param[3].Replace("-", ""), param[0] + param[2]);
- }
- }
- break;
- case ActionType.GiveBuff:
- {
- if (!Enum.IsDefined(typeof(BuffType), param[0])) return;
- int.TryParse(param[1], out int duration);
- bool.TryParse(param[2], out bool infinite);
- bool.TryParse(param[3], out bool visible);
- bool.TryParse(param[4], out bool stackable);
- player.AddBuff((BuffType)(byte)Enum.Parse(typeof(BuffType), param[0], true), player, Settings.Second * duration, new Stats(), visible);
- }
- break;
- case ActionType.RemoveBuff:
- {
- if (!Enum.IsDefined(typeof(BuffType), param[0])) return;
- BuffType bType = (BuffType)(byte)Enum.Parse(typeof(BuffType), param[0]);
- player.RemoveBuff(bType);
- }
- break;
- case ActionType.AddToGuild:
- {
- if (player.MyGuild != null) return;
- GuildObject guild = Envir.GetGuild(param[0]);
- if (guild == null) return;
- player.PendingGuildInvite = guild;
- player.GuildInvite(true);
- }
- break;
- case ActionType.RemoveFromGuild:
- {
- if (player.MyGuild == null) return;
- if (player.MyGuildRank == null) return;
- if (player.MyGuild.Name == Settings.NewbieGuild) player.RemoveBuff(BuffType.Newbie);
- if (player.HasBuff(BuffType.Guild)) player.RemoveBuff(BuffType.Guild);
- player.MyGuild.DeleteMember(player, player.Name);
- }
- break;
- case ActionType.RefreshEffects:
- {
- player.SetLevelEffects();
- var p = new S.ObjectLevelEffects { ObjectID = player.ObjectID, LevelEffects = player.LevelEffects };
- player.Enqueue(p);
- player.Broadcast(p);
- }
- break;
- case ActionType.CanGainExp:
- {
- bool.TryParse(param[0], out bool tempBool);
- player.CanGainExp = tempBool;
- }
- break;
- case ActionType.ComposeMail:
- {
- mailInfo = new MailInfo(player.Info.Index, false)
- {
- Sender = param[1],
- Message = param[0]
- };
- }
- break;
- case ActionType.AddMailGold:
- {
- if (mailInfo == null) return;
- uint.TryParse(param[0], out uint tempUint);
- mailInfo.Gold += tempUint;
- }
- break;
- case ActionType.AddMailItem:
- {
- if (mailInfo == null) return;
- if (mailInfo.Items.Count > 5) return;
- if (param.Count < 2 || !ushort.TryParse(param[1], out ushort count)) count = 1;
- var info = Envir.GetItemInfo(param[0]);
- if (info == null)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.FailedGetItemInfo), param[0], Key));
- break;
- }
- while (count > 0 && mailInfo.Items.Count < 5)
- {
- UserItem item = Envir.CreateFreshItem(info);
- if (item == null)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.FailedCreateUserItemPage), param[0], Key));
- return;
- }
- if (item.Info.StackSize > count)
- {
- item.Count = count;
- count = 0;
- }
- else
- {
- count -= item.Info.StackSize;
- item.Count = item.Info.StackSize;
- }
- mailInfo.Items.Add(item);
- }
- }
- break;
- case ActionType.SendMail:
- {
- if (mailInfo == null) return;
- mailInfo.Send();
- }
- break;
- case ActionType.GroupGoto:
- {
- if (player.GroupMembers == null) return;
- for (int j = 0; j < player.GroupMembers.Count(); j++)
- {
- var action = new DelayedAction(DelayedType.NPC, Envir.Time, player.NPCObjectID, player.NPCScriptID, "[" + param[0] + "]");
- player.GroupMembers[j].ActionList.Add(action);
- }
- }
- break;
- case ActionType.EnterMap:
- {
- if (!player.NPCData.TryGetValue("NPCMoveMap", out object _npcMoveMap) || !player.NPCData.TryGetValue("NPCMoveCoord", out object _npcMoveCoord)) return;
- player.Teleport((Map)_npcMoveMap, (Point)_npcMoveCoord, false);
- player.NPCData.Remove("NPCMoveMap");
- player.NPCData.Remove("NPCMoveCoord");
- }
- break;
- case ActionType.MakeWeddingRing:
- {
- player.MakeWeddingRing();
- }
- break;
- case ActionType.ForceDivorce:
- {
- player.NPCDivorce();
- }
- break;
- case ActionType.LoadValue:
- {
- string val = param[0];
- string filePath = param[1];
- string header = param[2];
- string key = param[3];
- InIReader reader = new InIReader(filePath);
- string loadedString = reader.ReadString(header, key, "");
- if (loadedString == "") break;
- AddVariable(player, val, loadedString);
- }
- break;
- case ActionType.SaveValue:
- {
- string filePath = param[0];
- string header = param[1];
- string key = param[2];
- string val = param[3];
- InIReader reader = new InIReader(filePath);
- reader.Write(header, key, val);
- }
- break;
- case ActionType.ConquestGuard:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- var conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (conquest == null) return;
- if (!int.TryParse(param[1], out tempInt)) return;
- ConquestGuildArcherInfo conquestArcher = conquest.ArcherList.FirstOrDefault(z => z.Index == tempInt);
- if (conquestArcher == null) return;
- if (conquestArcher.ArcherMonster != null)
- if (!conquestArcher.ArcherMonster.Dead) return;
- if (player.IsGM)
- {
- conquestArcher.Spawn(true);
- }
- else
- {
- if (player.MyGuild == null || player.MyGuild.Gold < conquestArcher.GetRepairCost()) return;
- player.MyGuild.Gold -= conquestArcher.GetRepairCost();
- player.MyGuild.SendServerPacket(new S.GuildStorageGoldChange() { Type = 2, Amount = conquestArcher.GetRepairCost() });
- conquestArcher.Spawn(true);
- }
- }
- break;
- case ActionType.ConquestGate:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- var conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (conquest == null) return;
- if (!int.TryParse(param[1], out tempInt)) return;
- ConquestGuildGateInfo conquestGate = conquest.GateList.FirstOrDefault(z => z.Index == tempInt);
- if (conquestGate == null) return;
- if (player.IsGM)
- {
- conquestGate.Repair();
- }
- else
- {
- if (player.MyGuild == null || player.MyGuild.Gold < conquestGate.GetRepairCost()) return;
- player.MyGuild.Gold -= (uint)conquestGate.GetRepairCost();
- player.MyGuild.SendServerPacket(new S.GuildStorageGoldChange() { Type = 2, Amount = (uint)conquestGate.GetRepairCost() });
- conquestGate.Repair();
- }
- }
- break;
- case ActionType.ConquestWall:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- var conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (conquest == null) return;
- if (!int.TryParse(param[1], out tempInt)) return;
- ConquestGuildWallInfo conquestWall = conquest.WallList.FirstOrDefault(z => z.Index == tempInt);
- if (conquestWall == null) return;
- if (player.IsGM)
- {
- conquestWall.Repair();
- }
- else
- {
- if (player.MyGuild == null || player.MyGuild.Gold < conquestWall.GetRepairCost()) return;
- player.MyGuild.Gold -= (uint)conquestWall.GetRepairCost();
- player.MyGuild.SendServerPacket(new S.GuildStorageGoldChange() { Type = 2, Amount = (uint)conquestWall.GetRepairCost() });
- conquestWall.Repair();
- }
- }
- break;
- case ActionType.ConquestSiege:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- var conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (conquest == null) return;
- if (!int.TryParse(param[1], out tempInt)) return;
- ConquestGuildSiegeInfo conquestSiege = conquest.SiegeList.FirstOrDefault(z => z.Index == tempInt);
- if (conquestSiege == null) return;
- if (conquestSiege.Gate != null)
- {
- if (!conquestSiege.Gate.Dead) return;
- }
- if (player.IsGM)
- {
- conquestSiege.Repair();
- }
- else
- {
- if (player.MyGuild == null || player.MyGuild.Gold < conquestSiege.GetRepairCost()) return;
- player.MyGuild.Gold -= (uint)conquestSiege.GetRepairCost();
- player.MyGuild.SendServerPacket(new S.GuildStorageGoldChange() { Type = 2, Amount = (uint)conquestSiege.GetRepairCost() });
- conquestSiege.Repair();
- }
- }
- break;
- case ActionType.TakeConquestGold:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- var conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (conquest == null) return;
- if (player.MyGuild != null && player.MyGuild.Guildindex == conquest.GuildInfo.Owner)
- {
- player.MyGuild.Gold += conquest.GuildInfo.GoldStorage;
- player.MyGuild.SendServerPacket(new S.GuildStorageGoldChange() { Type = 3, Amount = conquest.GuildInfo.GoldStorage });
- conquest.GuildInfo.GoldStorage = 0;
- }
- }
- break;
- case ActionType.SetConquestRate:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- var conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (conquest == null) return;
- if (!byte.TryParse(param[1], out byte tempByte)) return;
- if (player.MyGuild != null && player.MyGuild.Guildindex == conquest.GuildInfo.Owner)
- {
- conquest.GuildInfo.NPCRate = tempByte;
- }
- }
- break;
- case ActionType.StartConquest:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- var conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (conquest == null) return;
- if (!conquest.WarIsOn)
- {
- conquest.StartType = ConquestType.Forced;
- conquest.StartWar(conquest.GameType);
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.WarStarted), conquest.Info.Name));
- }
- else
- {
- conquest.WarIsOn = false;
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.WarStopped), conquest.Info.Name));
- }
- foreach (var pl in Envir.Players)
- {
- if (conquest.WarIsOn)
- {
- pl.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.WarStarted), conquest.Info.Name), ChatType.System);
- }
- else
- {
- pl.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.WarStopped), conquest.Info.Name), ChatType.System);
- }
- pl.BroadcastInfo();
- }
- }
- break;
- case ActionType.ScheduleConquest:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- var conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (conquest == null) return;
- if (player.MyGuild != null && player.MyGuild.Guildindex != conquest.GuildInfo.Owner && !conquest.WarIsOn)
- {
- conquest.GuildInfo.AttackerID = player.MyGuild.Guildindex;
- }
- }
- break;
- case ActionType.OpenGate:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- var Conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (Conquest == null) return;
- if (!int.TryParse(param[1], out tempInt)) return;
- ConquestGuildGateInfo OpenGate = Conquest.GateList.FirstOrDefault(z => z.Index == tempInt);
- if (OpenGate == null) return;
- if (OpenGate.Gate == null) return;
- OpenGate.Gate.OpenDoor();
- }
- break;
- case ActionType.CloseGate:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- var conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (conquest == null) return;
- if (!int.TryParse(param[1], out tempInt)) return;
- ConquestGuildGateInfo CloseGate = conquest.GateList.FirstOrDefault(z => z.Index == tempInt);
- if (CloseGate == null) return;
- if (CloseGate.Gate == null) return;
- CloseGate.Gate.CloseDoor();
- }
- break;
- case ActionType.OpenBrowser:
- {
- player.Enqueue(new S.OpenBrowser { Url = param[0] });
- }
- break;
- case ActionType.GetRandomText:
- {
- string randomTextPath = Path.Combine(Settings.NPCPath, param[0]);
- if (!File.Exists(randomTextPath))
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.RandomTextFileNotExist), randomTextPath));
- }
- else
- {
- var lines = File.ReadAllLines(randomTextPath);
- int index = Envir.Random.Next(0, lines.Length);
- string randomText = lines[index];
- AddVariable(player, param[1], randomText);
- }
- }
- break;
- case ActionType.PlaySound:
- {
- if (!int.TryParse(param[0], out int soundID)) return;
- player.Enqueue(new S.PlaySound { Sound = soundID });
- }
- break;
- case ActionType.SetTimer:
- {
- if (!int.TryParse(param[1], out int seconds) || !byte.TryParse(param[2], out byte type)) return;
- bool.TryParse(param[3], out bool global);
- if (seconds < 0) seconds = 0;
- if (global)
- {
- var timerKey = "_-" + param[0];
- Envir.Timers[timerKey] = new Timer(timerKey, seconds, type);
- }
- else
- {
- player.SetTimer(param[0], seconds, type);
- }
- }
- break;
- case ActionType.ExpireTimer:
- {
- var globalTimerKey = "_-" + param[0];
- if (Envir.Timers.ContainsKey(globalTimerKey))
- {
- Envir.Timers.Remove(globalTimerKey);
- }
- player.ExpireTimer(param[0]);
- }
- break;
- case ActionType.UnequipItem:
- {
- var slot = param[0];
- for (int e = 0; e < player.Info.Equipment.Length; e++)
- {
- var item = player.Info.Equipment[e];
- if (item == null) continue;
- var slotName = (EquipmentSlot)e;
- if (!string.IsNullOrEmpty(slot) && slot.ToLower() != slotName.ToString().ToLower()) continue;
- if (!player.CanRemoveItem(MirGridType.Inventory, item) || item.Cursed || item.WeddingRing != -1) continue;
- for (int k = 0; k < player.Info.Inventory.Length; k++)
- {
- var freeSlot = player.Info.Inventory[k];
- if (freeSlot != null) continue;
- player.Info.Equipment[e] = null;
- player.Info.Inventory[k] = item;
- player.Report.ItemMoved(item, MirGridType.Equipment, MirGridType.Inventory, e, k);
- break;
- }
- }
- S.UserSlotsRefresh packet = new S.UserSlotsRefresh
- {
- Inventory = new UserItem[player.Info.Inventory.Length],
- Equipment = new UserItem[player.Info.Equipment.Length],
- };
- player.Info.Inventory.CopyTo(packet.Inventory, 0);
- player.Info.Equipment.CopyTo(packet.Equipment, 0);
- player.Enqueue(packet);
- player.RefreshStats();
- }
- break;
- case ActionType.GTAllRecall:
- if (player.MyGuild == null)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.SummonGuildMembersMustBeInGuild), ChatType.System);
- return;
- }
- if (player.MyGuildRank.Index != 0)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.GuildLeaderSummonMembers), player.MyGuild.Name), ChatType.System);
- return;
- }
- //ok were confident the player has a guild and is rank 0 (which we assume is leader)
- foreach (PlayerObject ob in Envir.Players) //thers no accessable member list from the player.myguild....hmmm ok we will look at all players curently online
- {
- if (ob == null)
- {
- continue;//ignore people that dont exist, shouldnt happen but lets check for it
- }
- if (ob.Connection == null)
- {
- continue; //really shouldnt be needed but better safe than sorry
- }
- if (ob.Connection.Stage != GameStage.Game)
- {
- continue; //shouldnt be needed but lets make sure the player is in game
- }
- if (ob.MyGuild == null)
- {
- continue; //they aint in a guild? lets not check them further (oops)
- }
- if (ob.MyGuild.Name != player.MyGuild.Name)
- {
- continue; //not in my guild?who wants you!?
- }
- if (ob.Name == player.Name)
- {
- continue;//dont try to recall yourself
- }
- ob.Teleport(player.CurrentMap, new Point(player.CurrentLocation.X + Envir.Random.Next(4), player.CurrentLocation.Y + Envir.Random.Next(4)));
- ob.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouHaveBeenSummoned)+player.Name, ChatType.System);
- }
- break;
- case ActionType.GTRecall:
- if (player.MyGuild == null)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.SummonGuildMemberRequiresGuild), ChatType.System);
- return;
- }
- if (player.MyGuildRank.Index != 0)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.LeaderMaySummonMembers), player.MyGuild.Name), ChatType.System);
- return;
- }
- PlayerObject guildmember = Envir.GetPlayer(param[0]);
- if (guildmember == null)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.ICanNotSummonNotExist), param[0]), ChatType.System);
- return;
- }
- if (guildmember.Connection == null)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.ICannotSummon), param[0]), ChatType.System);
- continue; //really shouldnt be needed but better safe than sorry
- }
- if (guildmember.Connection.Stage != GameStage.Game)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.PlayerNotInGame), param[0]), ChatType.System);
- return;
- }
- if (guildmember.MyGuild == null)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.PlayerNotInGuild), param[0]), ChatType.System);
- return;
- }
- if (guildmember.MyGuild.Name != player.MyGuild.Name)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.PlayerNotInGuildButInAnother), param[0], player.MyGuild.Name, guildmember.MyGuild.Name), ChatType.System);
- return;
- }
- guildmember.Teleport(player.CurrentMap, new Point(player.CurrentLocation.X + Envir.Random.Next(4), player.CurrentLocation.Y + Envir.Random.Next(4)));
- guildmember.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.YouHaveBeenSummonedBy), player.Name), ChatType.System);
- break;
- case ActionType.GTSale:
- if (player.MyGuild == null)
- return;
- if (player.MyGuildRank.Index != 0 || player.CurrentMap.Info.GTIndex != player.MyGuild.GTIndex)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.LeaderInitiateSale), player.MyGuild.Name), ChatType.System);
- return;
- }
- if (!int.TryParse(param[0], out int saleprice))
- return;
- if (saleprice < 2000000)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.MinimumSalePriceMustBe2000000), ChatType.System);
- return;
- }
- if (!player.MyGuild.GTForSale(player, saleprice))
- return;
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.TerritoryListedForSale), ChatType.System);
- break;
- case ActionType.GTCancelSale:
- if (player.MyGuild == null)
- return;
- if (player.MyGuildRank.Index != 0 || player.CurrentMap.Info.GTIndex != player.MyGuild.GTIndex)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.OnlyLeaderMayCancelSale), player.MyGuild.Name), ChatType.System);
- return;
- }
- if (!player.MyGuild.EndGTSale(player))
- return;
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.TerritorySaleCancelled), ChatType.System);
- break;
- case ActionType.RollDie:
- {
- bool.TryParse(param[1], out bool autoRoll);
- var result = Envir.Random.Next(1, 7);
- S.Roll p = new S.Roll { Type = 0, Page = param[0], AutoRoll = autoRoll, Result = result };
- player.NPCData["NPCRollResult"] = result;
- player.Enqueue(p);
- }
- break;
- case ActionType.RollYut:
- {
- bool.TryParse(param[1], out bool autoRoll);
- var result = Envir.Random.Next(1, 7);
- S.Roll p = new S.Roll { Type = 1, Page = param[0], AutoRoll = autoRoll, Result = result };
- player.NPCData["NPCRollResult"] = result;
- player.Enqueue(p);
- }
- break;
- case ActionType.Drop:
- {
- var path = param[0];
- var drops = new List<DropInfo>();
- DropInfo.Load(drops, "NPC", path, 0, false);
- foreach (var drop in drops)
- {
- var reward = drop.AttemptDrop(player?.Stats[Stat.ItemDropRatePercent] ?? 0, player?.Stats[Stat.GoldDropRatePercent] ?? 0);
- if (reward != null)
- {
- if (reward.Gold > 0)
- {
- player.GainGold(reward.Gold);
- }
- foreach (var dropItem in reward.Items)
- {
- UserItem item = Envir.CreateDropItem(dropItem);
- if (item == null) continue;
- if (player != null && player.Race == ObjectType.Player)
- {
- PlayerObject ob = (PlayerObject)player;
- if (ob.CheckGroupQuestItem(item))
- {
- continue;
- }
- }
- if (drop.QuestRequired) continue;
- if (player.CanGainItem(item))
- {
- player.GainItem(item);
- }
- }
- }
- }
- }
- break;
- case ActionType.ReviveHero:
- player.ReviveHero();
- break;
- case ActionType.SealHero:
- player.SealHero();
- break;
- case ActionType.DeleteHero:
- player.DeleteHero();
- break;
- case ActionType.HeroGiveSkill:
- {
- if (player.Hero == null || player.Hero.Info == null) return;
- byte spellLevel = 0;
- Spell skill;
- if (!Enum.TryParse(param[0], true, out skill)) return;
- if (player.Hero.Info.Magics.Any(e => e.Spell == skill)) break;
- if (param.Count > 1)
- spellLevel = byte.TryParse(param[1], out spellLevel) ? Math.Min((byte)3, spellLevel) : (byte)0;
- var magic = new UserMagic(skill) { Level = spellLevel };
- if (magic.Info == null) return;
- player.Hero.Info.Magics.Add(magic);
- player.Hero.SendMagicInfo(magic);
- }
- break;
- case ActionType.HeroRemoveSkill:
- {
- if (player.Hero == null || player.Hero.Info == null) return;
- if (!Enum.TryParse(param[0], true, out Spell skill)) return;
- if (!player.Hero.Info.Magics.Any(e => e.Spell == skill)) break;
- for (var j = player.Hero.Info.Magics.Count - 1; j >= 0; j--)
- {
- if (player.Hero.Info.Magics[j].Spell != skill) continue;
- player.Hero.Info.Magics.RemoveAt(j);
- player.Hero.Enqueue(new S.RemoveMagic { PlaceId = j });
- }
- }
- break;
- case ActionType.ConquestRepairAll:
- {
- if (!player.IsGM)
- {
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouNotGMCommandDisabled), ChatType.System);
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.GMCommandConquestRepairAllNonGMInvoked), player.Name));
- return;
- }
- if (!int.TryParse(param[0], out int tempInt)) return;
- var conquest = Envir.Conquests.FirstOrDefault(z => z.Info.Index == tempInt);
- if (conquest == null) return;
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.ConquestRepairAllInvokedByGM), player.Name, player.Info.AccountInfo.Index));
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.Conquest), conquest.Info.Name));
- if (conquest.Guild != null)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.OwnerName), conquest.Guild.Name));
- }
- else
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NoCurrentOwner));
- }
- int _fixed = 0;
- foreach (ConquestGuildArcherInfo archer in conquest.ArcherList)
- {
- if (archer.ArcherMonster != null &&
- archer.ArcherMonster.Dead)
- {
- archer.Spawn(true);
- _fixed++;
- }
- }
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.ArchersRepaired), _fixed, conquest.ArcherList.Count), ChatType.System);
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.ArchersRepaired), _fixed, conquest.ArcherList.Count));
- _fixed = 0;
- foreach (ConquestGuildGateInfo conquestGate in conquest.GateList)
- {
- if (conquestGate != null)
- {
- conquestGate.Repair();
- _fixed++;
- }
- }
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.GatesRepaired), _fixed, conquest.GateList.Count), ChatType.System);
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.GatesRepaired), _fixed, conquest.GateList.Count));
- _fixed = 0;
- foreach (ConquestGuildWallInfo conquestWall in conquest.WallList)
- {
- if (conquestWall != null)
- {
- conquestWall.Repair();
- _fixed++;
- }
- }
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.WallsRepaired), _fixed, conquest.WallList.Count), ChatType.System);
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.WallsRepaired), _fixed, conquest.WallList.Count));
- _fixed = 0;
- foreach (ConquestGuildSiegeInfo conquestSiege in conquest.SiegeList)
- {
- if (conquestSiege != null)
- {
- conquestSiege.Repair();
- _fixed++;
- }
- }
- player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.SiegesRepaired), _fixed, conquest.SiegeList.Count), ChatType.System);
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.SiegesRepaired), _fixed, conquest.SiegeList.Count));
- break;
- }
- }
- }
- }
- private void Act(IList<NPCActions> acts, MonsterObject monster)
- {
- for (var i = 0; i < acts.Count; i++)
- {
- NPCActions act = acts[i];
- List<string> param = act.Params.Select(t => FindVariable(monster, t)).ToList();
- for (int j = 0; j < param.Count; j++)
- {
- var parts = param[j].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
- if (parts.Length == 0) continue;
- foreach (var part in parts)
- {
- param[j] = param[j].Replace(part, ReplaceValue(monster, part));
- }
- }
- switch (act.Type)
- {
- case ActionType.GiveHP:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- monster.ChangeHP(tempInt);
- }
- break;
- case ActionType.GlobalMessage:
- {
- if (!Enum.TryParse(param[1], true, out ChatType chatType)) return;
- var p = new S.Chat { Message = param[0], Type = chatType };
- Envir.Broadcast(p);
- }
- break;
- /* //mobs have no real "delayed" npc code so not added this yet
- case ActionType.Goto:
- DelayedAction action = new DelayedAction(DelayedType.NPC, -1, player.NPCID, "[" + param[0] + "]");
- player.ActionList.Add(action);
- break;
- */
- case ActionType.Break:
- {
- Page.BreakFromSegments = true;
- }
- break;
- case ActionType.Param1:
- {
- if (!int.TryParse(param[1], out int tempInt)) return;
- Param1 = param[0];
- Param1Instance = tempInt;
- }
- break;
- case ActionType.Param2:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- Param2 = tempInt;
- }
- break;
- case ActionType.Param3:
- {
- if (!int.TryParse(param[0], out int tempInt)) return;
- Param3 = tempInt;
- }
- break;
- case ActionType.Mongen:
- {
- if (Param1 == null || Param2 == 0 || Param3 == 0) return;
- if (!byte.TryParse(param[1], out byte tempByte)) return;
- var map = Envir.GetMapByNameAndInstance(Param1, Param1Instance);
- if (map == null) return;
- var monInfo = Envir.GetMonsterInfo(param[0]);
- if (monInfo == null) return;
- for (int j = 0; j < tempByte; j++)
- {
- MonsterObject mob = MonsterObject.GetMonster(monInfo);
- if (mob == null) return;
- mob.Direction = 0;
- mob.ActionTime = Envir.Time + 1000;
- mob.Spawn(map, new Point(Param2, Param3));
- }
- }
- break;
- case ActionType.MonClear:
- {
- if (!int.TryParse(param[1], out int tempInt)) return;
- var map = Envir.GetMapByNameAndInstance(param[0], tempInt);
- if (map == null) return;
- foreach (var cell in map.Cells)
- {
- if (cell == null || cell.Objects == null) continue;
- for (int j = 0; j < cell.Objects.Count(); j++)
- {
- MapObject ob = cell.Objects[j];
- if (ob.Race != ObjectType.Monster) continue;
- if (ob.Dead) continue;
- ob.Die();
- }
- }
- }
- break;
- case ActionType.Mov:
- {
- string value = param[0];
- AddVariable(monster, value, param[1]);
- }
- break;
- case ActionType.Calc:
- {
- int left;
- int right;
- bool resultLeft = int.TryParse(param[0], out left);
- bool resultRight = int.TryParse(param[2], out right);
- if (resultLeft && resultRight)
- {
- try
- {
- int result = Calculate(param[1], left, right);
- AddVariable(monster, param[3].Replace("-", ""), result.ToString());
- }
- catch (ArgumentException)
- {
- MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IncorrectOperatorPage), param[1], Key));
- }
- }
- else
- {
- AddVariable(monster, param[3].Replace("-", ""), param[0] + param[2]);
- }
- }
- break;
- case ActionType.GiveBuff:
- {
- if (!Enum.IsDefined(typeof(BuffType), param[0])) return;
- int.TryParse(param[1], out int tempInt);
- bool.TryParse(param[2], out bool infinite);
- bool.TryParse(param[3], out bool visible);
- bool.TryParse(param[4], out bool stackable);
- monster.AddBuff((BuffType)(byte)Enum.Parse(typeof(BuffType), param[0], true), monster, Settings.Second * tempInt, new Stats(), visible);
- }
- break;
- case ActionType.RemoveBuff:
- {
- if (!Enum.IsDefined(typeof(BuffType), param[0])) return;
- BuffType bType = (BuffType)(byte)Enum.Parse(typeof(BuffType), param[0]);
- monster.RemoveBuff(bType);
- }
- break;
- case ActionType.LoadValue:
- {
- string val = param[0];
- string filePath = param[1];
- string header = param[2];
- string key = param[3];
- var reader = new InIReader(filePath);
- string loadedString = reader.ReadString(header, key, "");
- if (loadedString == "") break;
- AddVariable(monster, val, loadedString);
- }
- break;
- case ActionType.SaveValue:
- {
- string filePath = param[0];
- string header = param[1];
- string key = param[2];
- string val = param[3];
- var reader = new InIReader(filePath);
- reader.Write(header, key, val);
- }
- break;
- }
- }
- }
- private void Success(PlayerObject player)
- {
- Act(ActList, player);
- var parseSay = new List<String>(Say);
- parseSay = ParseSay(player, parseSay);
- player.NPCSpeech.AddRange(parseSay);
- }
- private void Failed(PlayerObject player)
- {
- Act(ElseActList, player);
- var parseElseSay = new List<String>(ElseSay);
- parseElseSay = ParseSay(player, parseElseSay);
- player.NPCSpeech.AddRange(parseElseSay);
- }
- private void Success(MonsterObject Monster)
- {
- Act(ActList, Monster);
- }
- private void Failed(MonsterObject Monster)
- {
- Act(ElseActList, Monster);
- }
- private void Success()
- {
- Act(ActList);
- }
- private void Failed()
- {
- Act(ElseActList);
- }
- public static bool Compare<T>(string op, T left, T right) where T : IComparable<T>
- {
- switch (op)
- {
- case "<": return left.CompareTo(right) < 0;
- case ">": return left.CompareTo(right) > 0;
- case "<=": return left.CompareTo(right) <= 0;
- case ">=": return left.CompareTo(right) >= 0;
- case "==": return left.Equals(right);
- case "!=": return !left.Equals(right);
- default: throw new ArgumentException("Invalid comparison operator: {0}", op);
- }
- }
- public static int Calculate(string op, int left, int right)
- {
- switch (op)
- {
- case "+": return left + right;
- case "-": return left - right;
- case "*": return left * right;
- case "/": return left / right;
- default: throw new ArgumentException("Invalid sum operator: {0}", op);
- }
- }
- }
- }
|