| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073 |
- /*
- * ===============
- * INTRODUCTION:
- * ===============
- *
- * fixes.inc - Community patch for buggy SA:MP functions.
- *
- * ================
- * LIST OF FIXES:
- * ================
- *
- * FIX: GetPlayerColor
- * PROBLEM: Returns "0" if "SetPlayerColor" has never been called.
- * SOLUTION: Call "SetPlayerColor" in "OnPlayerConnect".
- * SEE: "OnPlayerConnect".
- * AUTHOR: KoczkaHUN
- * POST: http://forum.sa-mp.com/showpost.php?p=1486048
- *
- * FIX: FILTERSCRIPT
- * PROBLEM: Despite the fact that is in every new script, many people don't
- * define "FILTERSCRIPT" where appropriate.
- * SOLUTION: Provide an "IS_FILTERSCRIPT" variable (note the naming to match
- * the original macro).
- * AUTHOR: Y_Less
- * SEE: "OnFilterScriptInit" and "OnGameModeInit".
- *
- * FIX: SpawnPlayer
- * PROBLEM: Kills the player if they are in a vehicle.
- * SOLUTION: Remove the from the vehicle.
- * SEE: "FIXES_SpawnPlayer".
- * AUTHOR: Y_Less
- *
- * FIX: SetPlayerName
- * PROBLEM: Using "SetPlayerName" when the new name only differs from the old
- * name in case does not alter the name at all.
- * SOLUTION: Change their name twice - once to "_FIXES TEMP NAME" and then to
- * the actual required name.
- * SEE: "OnPlayerConnect" and "FIXES_SetPlayerName".
- * AUTHOR: Y_Less/Slice/xX_Simon_Xx
- * POST: https://github.com/Y-Less/sa-mp-fixes/issues/3
- *
- * FIX: GetPlayerSkin
- * PROBLEM: Returns the new skin after "SetSpawnInfo" is called but before the
- * player actually respawns to get the new skin.
- * SOLUTION: Record the skin in "OnPlayerSpawn" and always return that one.
- * SEE: "OnPlayerSpawn", "FIXES_GetPlayerSkin" and "FIXES_SetPlayerSkin".
- * AUTHOR: Y_Less
- *
- * FIX: GetWeaponName
- * PROBLEM: Returns nothing for 18, 44, and 45.
- * SOLUTION: Return the correct names ("Molotov Cocktail", "Thermal Goggles",
- * and "Night vision Goggles").
- * SEE: "FIXES_GetWeaponName".
- * AUTHOR: Y_Less
- *
- * FIX: SetPlayerWorldBounds
- * PROBLEM: Aiming can bypass the edge.
- * SOLUTION: Check for the player leaving the area and reset them to their last
- * good position if they leave the area (aiming or not).
- * SEE: "OnPlayerUpdate" and "FIXES_SetPlayerWorldBounds".
- * AUTHOR: Y_Less
- *
- * FIX: TogglePlayerControllable
- * PROBLEM: Other players see you moving on the spot.
- * SOLUTION: Return 0 in OnPlayerUpdate.
- * SEE: "FIXES_TogglePlayerControllable" and "OnPlayerUpdate".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=876854
- *
- * FIX: HydraSniper
- * PROBLEM: Entring military aircraft with a sniper rifle messes up vies.
- * SOLUTION: Set their armed weapon to fists.
- * SEE: "OnPlayerStateChange", "FIXES_GivePlayerWeapon",
- * "FIXES_SetPlayerArmedWeapon".
- * AUTHOR: funky1234
- * POST: http://forum.sa-mp.com/showpost.php?p=965644
- *
- * FIX: IsPlayerInCheckpoint
- * PROBLEM: Function returns an undefined value if it is called before any
- * other checkpoint functions are called to initialise the value.
- * SOLUTION: Call "DisablePlayerCheckpoint" when they connect.
- * SEE: "OnPlayerConnect".
- * AUTHOR: Y_Less
- *
- * FIX: IsPlayerInRaceCheckpoint
- * PROBLEM: Function returns an undefined value if it is called before any
- * other race checkpoint functions are called to initialise the value.
- * SOLUTION: Call "DisablePlayerRaceCheckpoint" when they connect.
- * SEE: "OnPlayerConnect".
- * AUTHOR: Y_Less
- *
- * FIX: GetPlayerWeapon
- * PROBLEM: Returns the old value after using "SetPlayerArmedWeapon" when they
- * are in a vehicle.
- * SOLUTION: If "SetPlayerArmedWeapon" is called in a vehicle, store the new
- * value and return that instead.
- * SEE: "OnPlayerStateChange", "FIXES_SetPlayerArmedWeapon", and
- * "FIXES_GetPlayerWeapon".
- * AUTHOR: Y_Less
- *
- * FIX: PutPlayerInVehicle
- * PROBLEM: If this is used on a passenger the driver of their old vehicle
- * doesn't see them in their new vehicle.
- * SOLUTION: Remove them from the vehicle first.
- * SEE: "OnPlayerStateChange" and "FIXES_PutPlayerInVehicle".
- * AUTHOR: leong124/Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=1265965
- *
- * FIX: KEY_AIM
- * PROBLEM: "KEY_AIM" isn't defined by default.
- * SOLUTION: Define it.
- * SEE: N/A.
- * AUTHOR: Y_Less
- *
- * FIX: SetPlayerCheckpoint
- * PROBLEM: If a checkpoint is already set it will use the size of that
- * checkpoint instead of the new one.
- * SOLUTION: Call "DisablePlayerCheckpoint" before setting the checkpoint.
- * SEE: "FIXES_SetPlayerCheckpoint".
- * AUTHOR: KoczkaHUN
- * POST: http://forum.sa-mp.com/showpost.php?p=1482401
- *
- * FIX: SetPlayerRaceCheckpoint
- * PROBLEM: If a checkpoint is already set it will use the size of that
- * checkpoint instead of the new one.
- * SOLUTION: Call "DisablePlayerRaceCheckpoint" before setting the checkpoint.
- * SEE: "FIXES_SetPlayerRaceCheckpoint".
- * AUTHOR: KoczkaHUN
- * POST: http://forum.sa-mp.com/showpost.php?p=1482401
- *
- * FIX: TextDrawCreate
- * PROBLEM: Crashes on a blank string.
- * SOLUTION: Intercept blank strings.
- * SEE: "FIXES_TextDrawCreate".
- * AUTHOR: wups
- * POST: http://forum.sa-mp.com/showpost.php?p=1484008
- *
- * FIX: TextDrawSetString
- * PROBLEM: Crashes on a blank string and size greater than 1024.
- * SOLUTION: Intercept blank strings and truncate long strings.
- * SEE: "FIXES_TextDrawSetString".
- * AUTHOR: TomTrox
- * POST: http://forum.sa-mp.com/showpost.php?p=1487870
- *
- * FIX: CreatePlayerTextDraw
- * PROBLEM: Crashes on a blank string.
- * SOLUTION: Intercept blank strings.
- * SEE: "FIXES_CreatePlayerTextDraw".
- * AUTHOR: wups/Y_Less
- *
- * FIX: PlayerTextDrawSetString
- * PROBLEM: Crashes on a blank string and size greater than 1024.
- * SOLUTION: Intercept blank strings and truncate long strings.
- * SEE: "FIXES_PlayerTextDrawSetString".
- * AUTHOR: TomTrox/Y_Less
- *
- * FIX: AllowInteriorWeapons
- * PROBLEM: Does nothing.
- * SOLUTION: Set the player's weapon to fists in an interior.
- * SEE: "FIXES_AllowInteriorWeapons", "OnGameModeInit" and
- * "OnPlayerUpdate".
- * AUTHOR: KoczkaHUN
- * POST: http://forum.sa-mp.com/showpost.php?p=1502696
- *
- * FIX: OnPlayerEnterVehicle
- * PROBLEM: Crashes other players when people enter an invalid seat.
- * SOLUTION: Desync the people with invalid seats.
- * SEE: "OnPlayerStateChange" and "OnPlayerUpdate".
- * AUTHOR: RyDeR`/Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=1410296
- *
- * FIX: OnPlayerEnterVehicle_2
- * PROBLEM: Crashes the server when hacks enter an invalid vehicle.
- * SOLUTION: Desync the people with invalid vehicles.
- * SEE: "OnPlayerEnterVehicle".
- * AUTHOR: im/Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=2340900
- *
- * FIX: AllowTeleport
- * PROBLEM: 0.3dRC9 removed "AllowPlayerTeleport" and "AllowAdminTeleport" in
- * favour of "OnPlayerClickMap". Some scripts used the old code and.
- * SOLUTION: Teleport the player in "OnPlayerClickMap".
- * SEE: "OnPlayerClickMap", "FIXES_AllowPlayerTeleport", and
- * "FIXES_AllowAdminTeleport".
- * AUTHOR: Y_Less
- *
- * FIX: SetPlayerSpecialAction
- * PROBLEM: Removing jetpacks from players by setting their special action to 0
- * causes the sound to stay until death.
- * SOLUTION: Call "ClearAnimations" before "SetPlayerSpecialAction".
- * SEE: "FIXES_SetPlayerSpecialAction".
- * AUTHOR: MP2
- * POST: Private message from MP2.
- *
- * FIX: OnDialogResponse
- * PROBLEM: Cheaters can spoof the dialogid they are using to respond to ones
- * they can't actually see.
- * SOLUTION: Store the displayed dialogid and use that instead.
- * SEE: "FIXES_OnDialogResponse", "FIXES_ShowPlayerDialog".
- * AUTHOR: Y_Less
- * FIXED IN: 0.3e RC6
- *
- * FIX: GetPlayerDialog
- * PROBLEM: This function doesn't exist. Fixed for hidden dialogs.
- * SOLUTION: Add it. DEFAULTS TO FALSE!
- * SEE: "FIXES_GetPlayerDialog".
- * AUTHOR: Y_Less/xX_Simon_Xx
- * POST: http://forum.sa-mp.com/showpost.php?p=2141254
- *
- * FIX: PlayerDialogResponse
- * PROBLEM: A player's dialog doesn't hide when the gamemode restarts, causing
- * the server to print "Warning: PlayerDialogResponse PlayerId: 0
- * dialog ID doesn't match last sent dialog ID".
- * SOLUTION: Hide it.
- * SEE: "OnPlayerConnect", "OnGameModeExit".
- * AUTHOR: xX_Simon_Xx
- * POST: https://github.com/Y-Less/sa-mp-fixes/issues/2
- *
- * FIX: SetSpawnInfo
- * PROBLEM: Kicks the player if "SpawnPlayer" is called before "SetSpawnInfo".
- * SOLUTION: Call "SetSpawnInfo" at least once.
- * SEE: "OnPlayerConnect".
- * AUTHOR: Y_Less
- *
- * FIX: SetPlayerSkin
- * PROBLEM: Breaks sitting on bikes.
- * SOLUTION: Put them back in the vehicle after setting their skin.
- * SEE: "FIXES_SetPlayerSkin".
- * AUTHOR: CyNiC
- * POST: http://forum.sa-mp.com/showpost.php?p=1756094
- *
- * FIX: HideMenuForPlayer
- * PROBLEM: Crashes when passed an invalid menu ID.
- * SOLUTION: Don't hide it when passed an invalid menu.
- * SEE: "FIXES_HideMenuForPlayer".
- * AUTHOR: Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=1787297
- *
- * FIX: valstr
- * PROBLEM: Crashes on large numbers.
- * SOLUTION: Use "format" instead.
- * SEE: "FIXES_valstr".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1790300
- *
- * FIX: fclose
- * PROBLEM: Crashes on an invalid handle.
- * SOLUTION: Check for an invalid handle.
- * SEE: "FIXES_fclose".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1790300
- *
- * FIX: fwrite
- * PROBLEM: Crashes on an invalid handle.
- * SOLUTION: Check for an invalid handle.
- * SEE: "FIXES_fwrite".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1790300
- *
- * FIX: fread
- * PROBLEM: Crashes on an invalid handle.
- * SOLUTION: Check for an invalid handle.
- * SEE: "FIXES_fread".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1790300
- *
- * FIX: fputchar
- * PROBLEM: Crashes on an invalid handle.
- * SOLUTION: Check for an invalid handle.
- * SEE: "FIXES_fputchar".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1790300
- *
- * FIX: fgetchar
- * PROBLEM: Crashes on an invalid handle.
- * SOLUTION: Check for an invalid handle.
- * SEE: "FIXES_fgetchar".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1790300
- *
- * FIX: fblockwrite
- * PROBLEM: Crashes on an invalid handle.
- * SOLUTION: Check for an invalid handle.
- * SEE: "FIXES_fblockwrite".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1790300
- *
- * FIX: fblockread
- * PROBLEM: Crashes on an invalid handle.
- * SOLUTION: Check for an invalid handle.
- * SEE: "FIXES_fblockread".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1790300
- *
- * FIX: fseek
- * PROBLEM: Crashes on an invalid handle.
- * SOLUTION: Check for an invalid handle.
- * SEE: "FIXES_fseek".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1790300
- *
- * FIX: flength
- * PROBLEM: Crashes on an invalid handle.
- * SOLUTION: Check for an invalid handle.
- * SEE: "FIXES_flength".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1790300
- *
- * FIX: file_inc
- * PROBLEM: Includes or excludes all the file function fixes together (can
- * cause major overhead).
- * SOLUTION: Optionally group them all under one define. DEFAULTS TO FALSE!
- * SEE: "FIX_file_inc".
- * AUTHOR: Y_Less
- *
- * FIX: IsPlayerAttachedObjectSlotUsed
- * PROBLEM: Doesn't work in OnPlayerDisconnect.
- * SOLUTION: Maintain an internal record of slots used.
- * SEE: "FIXES_SetPlayerAttachedObject",
- * "FIXES_RemovePlayerAttachedObject",
- * "FIXES_IsPAttachedObjectSlotUsed", and
- * "OnPlayerDisconnect".
- * AUTHOR: Y_Less
- *
- * FIX: SetPlayerAttachedObject
- * PROBLEM: Doesn't remove objects when the mode ends.
- * SOLUTION: Remove them.
- * SEE: "FIXES_SetPlayerAttachedObject",
- * "FIXES_RemovePlayerAttachedObject", and
- * "OnPlayerDisconnect".
- * AUTHOR: Y_Less
- *
- * FIX: OnPlayerDeath
- * PROBLEM: Clients get stuck when they die with an animation applied.
- * SOLUTION: Clear their animations.
- * SEE: "OnPlayerDeath" and "OnPlayerUpdate".
- * AUTHOR: h02
- * POST: http://forum.sa-mp.com/showpost.php?p=1641144
- *
- * FIX: strins
- * PROBLEM: Ignores the "maxlength" parameter causing possible crashes.
- * SOLUTION: Manually check the length.
- * SEE: "FIXES_strins".
- * AUTHOR: Slice/Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=1860495
- * POST: http://forum.sa-mp.com/showpost.php?p=1864706
- *
- * FIX: IsPlayerConnected
- * PROBLEM: Only uses the lower two bytes of a passed ID.
- * SOLUTION: Mask the numbers.
- * SEE: "FIXES_IsPlayerConnected".
- * AUTHOR: Slice
- * POST: http://forum.sa-mp.com/showpost.php?p=1860464
- *
- * FIX: OnPlayerCommandText
- * PROBLEM: Can crash ZCMD when passed a null string.
- * SOLUTION: Pass NULL if invalid inputs given.
- * SEE: "OnPlayerCommandText".
- * AUTHOR: Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=1909511
- *
- * FIX: TrainExit
- * PROBLEM: When getting out of a train entered by "PutPlayerInVehicle", the
- * camera does not reset properly.
- * SOLUTION: Reset the camera.
- * SEE: "FIXES_PutPlayerInVehicle", "FIXES_OnPlayerStateChange".
- * AUTHOR: Terminator3/Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=1980214
- *
- * FIX: Kick
- * PROBLEM: Calling "Kick" in "OnPlayerConnect" doesn't work properly.
- * SOLUTION: Defer it.
- * SEE: "OnPlayerConnect", "FIXES_Kick".
- * AUTHOR: Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=1989453
- * FIXED IN: 0.3x
- *
- * FIX: OnVehicleMod
- * PROBLEM: Crashes other players when invalid mods are applied.
- * SOLUTION: Desync the player.
- * SEE: "OnVehicleMod".
- * AUTHOR: JernejL/Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=1671500
- *
- * FIX: random
- * PROBLEM: Doesn't work with negative numbers.
- * SOLUTION: Invert then reinvert. DEFAULTS TO FALSE!
- * SEE: "FIXES_random".
- * AUTHOR: xX_Simon_Xx
- * POST: http://forum.sa-mp.com/showpost.php?p=2141254
- *
- * FIX: sleep
- * PROBLEM: Leaks bytes from the stack.
- * SOLUTION: Call a function to store the correct value.
- * SEE: "FIXES_sleep".
- * AUTHOR: Y_Less
- *
- * FIX: AddMenuItem
- * PROBLEM: Crashes when passed an invalid menu ID.
- * SOLUTION: Don't hide it when passed an invalid menu.
- * SEE: "FIXES_AddMenuItem".
- * AUTHOR: Y_Less
- *
- * FIX: SetMenuColumnHeader
- * PROBLEM: Crashes when passed an invalid menu ID.
- * SOLUTION: Don't hide it when passed an invalid menu.
- * SEE: "FIXES_SetMenuColumnHeader".
- * AUTHOR: Y_Less
- *
- * FIX: ShowMenuForPlayer
- * PROBLEM: Crashes when passed an invalid menu ID.
- * SOLUTION: Don't hide it when passed an invalid menu.
- * SEE: "FIXES_ShowMenuForPlayer".
- * AUTHOR: Y_Less
- *
- * FIX: HideMenuForPlayer
- * PROBLEM: Crashes when passed an invalid menu ID.
- * SOLUTION: Don't hide it when passed an invalid menu.
- * SEE: "FIXES_HideMenuForPlayer".
- * AUTHOR: Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=1787297
- *
- * FIX: HideMenuForPlayer_2
- * PROBLEM: Ignores the "menuid" parameter.
- * SOLUTION: Only hide the correct menu. DEFAULTS TO FALSE!
- * SEE: "FIXES_HideMenuForPlayer".
- * AUTHOR: Y_Less
- *
- * FIX: DisableMenu
- * PROBLEM: Crashes when passed an invalid menu ID.
- * SOLUTION: Don't hide it when passed an invalid menu.
- * SEE: "FIXES_DisableMenu".
- * AUTHOR: Y_Less
- *
- * FIX: DisableMenuRow
- * PROBLEM: Crashes when passed an invalid menu ID.
- * SOLUTION: Don't hide it when passed an invalid menu.
- * SEE: "FIXES_DisableMenuRow".
- * AUTHOR: Y_Less
- *
- * FIX: Menus
- * PROBLEM: All menu function fixes are included separately for major overhead.
- * SOLUTION: Optionally group them all under one define.
- * SEE: "FIX_Menus", "_FIX_Menus"
- * AUTHOR: Y_Less
- *
- * FIX: GetPlayerMenu
- * PROBLEM: Returns previous menu when none is displayed.
- * SOLUTION: Return the correct value.
- * SEE: "FIXES_GetPlayerMenu", "OnPlayerSelectedMenuRow".
- * AUTHOR: Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=2295867
- *
- * FIX: GetPlayerInterior
- * PROBLEM: Always returns 0 for NPCs.
- * SOLUTION: Return the correct value.
- * SEE: "FIXES_GetPlayerInterior", "FIXES_SetPlayerInterior".
- * AUTHOR: Y_Less/xX_Simon_Xx
- * POST: http://forum.sa-mp.com/showpost.php?p=2309246
- *
- * FIX: ClearAnimations
- * PROBLEM: Use ClearAnimation while you are in a vehicle cause the player exit
- * from it.
- * SOLUTION: Apply an animation instead of clear animation.
- * SEE: "FIXES_ClearAnimations".
- * AUTHOR: xX_Simon_Xx
- * POST: https://github.com/Y-Less/sa-mp-fixes/issues/4
- *
- * FIX: ClearAnimations_2
- * PROBLEM: ClearAnimations doesn't do anything when the animation ends if we
- * pass 1 for the freeze parameter in ApplyAnimation.
- * SOLUTION: Apply an idle animation for stop and then use ClearAnimation.
- * SEE: "FIXES_ClearAnimations".
- * AUTHOR: xX_Simon_Xx
- * POST: https://github.com/Y-Less/sa-mp-fixes/issues/4
- *
- * FIX: DriveBy
- * PROBLEM: If you press KEY_CROUCH while you're passenger and if you are
- * armed, the player start to aim; if you repress KEY_CROUCH the
- * player don't return in vehicle.
- * SOLUTION: Apply the animation to return the player in the vehicle.
- * SEE: "OnPlayerKeyStateChange".
- * AUTHOR: xX_Simon_Xx
- * POST: https://github.com/Y-Less/sa-mp-fixes/issues/13
- *
- * FIX: GangZoneCreate
- * PROBLEM: Gang zones bug on the main map for players at certain angles
- * relative to them.
- * SOLUTION: Set a non floating value for the gang zone co-ordinate.
- * SEE: "FIXES_GangZoneCreate".
- * AUTHOR: xX_Simon_Xx/Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=2144109
- *
- * FIX: SPECIAL_ACTION_PISSING
- * PROBLEM: "SPECIAL_ACTION_PISSING" isn't defined by default.
- * SOLUTION: Define it.
- * SEE: N/A.
- * AUTHOR: xX_Simon_Xx
- * POST: https://github.com/Y-Less/sa-mp-fixes/issues/6
- *
- * FIX: IsValidVehicle
- * PROBLEM: "IsValidVehicle" isn't defined by default.
- * SOLUTION: Define it.
- * SEE: N/A.
- * AUTHOR: xX_Simon_Xx
- * POST: http://forum.sa-mp.com/showpost.php?p=2693650
- *
- * FIX: ApplyAnimation
- * PROBLEM: Passing an invalid animation library in ApplyAnimation causes a
- * client crash for streamed in players.
- * SOLUTION: Block ApplyAnimation when an invalid library is passed.
- * SEE: "FIXES_ApplyAnimation".
- * AUTHOR: xX_Simon_Xx
- * POST: https://github.com/Y-Less/sa-mp-fixes/issues/5
- *
- * FIX: ApplyAnimation_2
- * PROBLEM: First time a library is used, it does nothing.
- * SOLUTION: Apply animations twice when first using a library.
- * SEE: "FIXES_ApplyAnimation".
- * AUTHOR: xX_Simon_Xx/Lordzy/Y_Less
- * POST: http://forum.sa-mp.com/showpost.php?p=3052627
- *
- * FIX: OnPlayerSpawn
- * PROBLEM: San Andreas deducts $100 from players.
- * SOLUTION: Give them it back.
- * SEE: "OnPlayerSpawn".
- * AUTHOR: Y_Less
- *
- * FIX: GetGravity
- * PROBLEM: "GetGravity" isn't defined by default.
- * SOLUTION: Define it.
- * SEE: N/A.
- * AUTHOR: Whitetiger
- * POST: http://forum.sa-mp.com/showpost.php?p=1706447
- *
- * FIX: gpci
- * PROBLEM: "gpci" isn't defined by default.
- * SOLUTION: Define it.
- * SEE: N/A.
- * AUTHOR: xX_Simon_Xx
- * POST: http://pastebin.com/VQSGpbSm
- *
- * FIX: Natives
- * PROBLEM: Several natives are included by default, this enables or disables
- * them all. Therefore this is an umbrella fix for several fixes.
- * SOLUTION: Define them.
- * SEE: "FIX_GetGravity", "FIX_gpci", "FIX_IsValidVehicle".
- * AUTHOR: Y_Less
- *
- * FIX: OnPlayerConnect
- * PROBLEM: This function isn't called for players when a filterscript starts.
- * SOLUTION: Call it for all connected players.
- * SEE: "FIXES_OnFilterScriptInit".
- * AUTHOR: Y_Less
- *
- * FIX: OnPlayerDisconnect
- * PROBLEM: This function isn't called for players when a filterscript ends.
- * SOLUTION: Call it for all connected players.
- * SEE: "FIXES_OnFilterScriptExit".
- * AUTHOR: Y_Less
- *
- * FIX: GameText
- * PROBLEM: Several styles do not display for the time specified.
- * SOLUTION: Recreate the styles in Text Draws and use those instead.
- * SEE: "FIXES_GameTextForAll", "FIXES_GameTextForPlayer".
- * AUTHOR: Y_Less
- *
- * FIX: GameTextStyles
- * PROBLEM: San Andreas has fixed styles for area and vehicle names, but they
- * are not included in the GameText styles list.
- * SOLUTION: Add them. DEFAULTS TO FALSE.
- * SEE: "FIXES_GameTextForAll", "FIXES_GameTextForPlayer".
- * AUTHOR: Y_Less
- *
- * FIX: HideGameText
- * PROBLEM: There is no "HideGameTextForXYZ" function.
- * SOLUTION: Show a single space for a game text. DEFAULTS TO FALSE.
- * SEE: "FIXES_HideGameTextForAll", "FIXES_HideGameTextForPlayer".
- * AUTHOR: Y_Less
- *
- * FIX: BODYPARTS
- * PROBLEM: The bodyparts to be used in OnPlayer(Take/Give)Damage are not
- * defined by default
- * SOLUTION: Define it.
- * SEE: N/A.
- * AUTHOR: Whitetiger
- *
- * FIX: CAMERAMODES
- * PROBLEM: The camera modes for GetPlayerCameraMode are not defined by
- * default.
- * SOLUTION: Define it.
- * SEE: N/A.
- * AUTHOR: Whitetiger
- * POST: http://forum.sa-mp.com/showpost.php?p=1309730
- *
- * FIX: SetPlayerCamera
- * PROBLEM: Using the camera functions directly after enabling spectator mode
- * doesn't work.
- * SOLUTION: Defer them.
- * SEE: "FIXES_SetPlayerCameraPos", "FIXES_SetPlayerCameraLookAt",
- * "FIXES_TogglePlayerSpectating".
- * AUTHOR: Emmet_
- *
- * FIX: SetPlayerTime
- * PROBLEM: Using this function under "OnPlayerConnect" doesn't work.
- * SOLUTION: Defer it.
- * SEE: "FIXES_SetPlayerTime"
- * AUTHOR: Emmet_
- *
- * FIX: OnPlayerRequestClass
- * PROBLEM: Random blunts and bottles sometimes appear in class selection.
- * SOLUTION: Call "RemoveBuildingForPlayer".
- * SEE: "OnPlayerRequestClass"
- * AUTHOR: Y_Less
- *
- * ==============
- * STYLE RULES:
- * ==============
- *
- * All globals should be "static stock" whenever possible (so they can only be
- * accessed from this one file).
- *
- * Statics must start with "FIXES_gs", and all other globals with "FIXES_g".
- *
- * All functions not overriding existing functions must start with "FIXES_".
- *
- * Macros must be upper case, use underscores, and start "FIXES_":
- * "FIXES_LIKE_THIS".
- *
- * Functions should be upper camel case (as the original functions are)
- * "FIXES_LikeThis".
- *
- * Globals (after the prefix) should be upper camel case "LikeThis", and locals
- * lower camel case "likeThis".
- *
- * ALS should be used to hook functions and callbacks. See this topic for more
- * details:
- *
- * http://forum.sa-mp.com/showthread.php?t=441293
- *
- * The ALS prefix for chaining is "FIXES_".
- *
- * When redefining a native, add a "BAD_" external name declaration with the
- * "_ALS_" definition so that others may use the original native if they so
- * desire (with the caveat that it may break all fixes). Note the "BAD_"
- * name is meant to indicate the possibility of breaking the fix, not a
- * comment on the original native function.
- *
- * The ALS hook defines used here are a little different to the normal ones as
- * this file assumes that it is always first. The pattern is:
- *
- * #if defined _ALS_NameOfFixHere
- * #error _ALS_NameOfFixHere defined
- * #endif
- * native BAD_NameOfFixHere(params) = NameOfFixHere;
- *
- * #if FIX_NameOfFixHere
- * stock FIXES_NameOfFixHere(params)
- * {
- * return 0;
- * }
- *
- * #define _ALS_NameOfFixHere
- * #define NameOfFixHere FIXES_NameOfFixHere
- * #endif
- *
- * A copyable version of this pattern is at the end of the file.
- *
- * Enums start with "E_" or "e_" depending on type, then follow rules for
- * macros.
- *
- * NO libraries should be included - not even the default SA:MP ones. Let the
- * user do it.
- *
- * Due to the above rule, you cannot assume any third party libraries AT ALL, so
- * do not use them. This can lead to some code duplication, but also means
- * that the version of the code used here can be tailored for optimisations.
- *
- * Certain terms may be shortened when dealing with long callback names to avoid
- * compile truncation warnings (max symbol length is 31). Current list:
- *
- * "Checkpoint" -> "CP"
- * "Update" -> "Upd"
- * "TextDraw" -> "TD"
- * "Object" -> "Obj"
- * "Player" -> "P"
- *
- * Document all fixes at the top of the file, and highlight code.
- *
- * 4 space TABS - do not edit this file in PAWNO unless you know how to correct
- * the indentation.
- *
- * All rules have exceptions, but they must be justifiable. For example
- * "IS_FILTERSCRIPT" is a global variable, but is not called
- * "FIXES_gIsFilterscript" to better match the "FILTERSCRIPT" macro it
- * replaces. Now a macro for "_FIXES_gIsFilterscript".
- *
- * Variables which need to be fully global (i.e. not "static"), but should not
- * actually be used by other people (e.g. appear inside a macro) should be
- * prefixed with "_FIXES" instead of "FIXES" to indicate their private use.
- *
- * No comments beyond the end of column 80 (where the line in "PAWNO" is).
- *
- * If a bug is fixed in some version of the server it can be conditionally
- * included here. This is done by checking for the existance of a native
- * function introduced in the same server version. For example
- * "TogglePlayerControllable" was fixed in 0.3eRC6, the same time as the
- * "SetObjectMaterial" native was introduced, thus the inclusion becomes:
- *
- * #if !defined FIX_TogglePlayerControllable
- * #if defined SetObjectMaterial
- * #define FIX_TogglePlayerControllable (0)
- * #else
- * #define FIX_TogglePlayerControllable (1)
- * #endif
- * #elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable)
- * #undef FIX_TogglePlayerControllable
- * #define FIX_TogglePlayerControllable (2)
- * #endif
- *
- * This only includes this fix if that native doesn't exist. A copyable
- * version of this pattern is at the end of the file.
- *
- * To reduce general memory consumption, strings in this include are stored
- * globally in constant arrays and referenced. This is EXACTLY as fast as
- * using the string constants directly, but means that strings are not
- * stored in the assembly multiple times (unless the string is only used
- * once, in which case it's more work for no gain). See this post for more
- * details:
- *
- * http://forum.sa-mp.com/showpost.php?p=1795601
- *
- * DO NOT EDIT THIS FILE IN PAWNO OR ON GITHUB. Both mess up the spacing -
- * GitHub in an almost irreversible way (except for the fact that nothing is
- * irreversible in source control. Pawno spacing is less tricky to solve,
- * and can be worked around if you know when it uses spaces and tabs - in
- * short, always write code first THEN indent and you won't have a problem
- * (in that editor at least, that is normally a bad way to write code).
- *
- * Documentation explanation:
- *
- * FIX: <Short name>
- * PROBLEM: <Description of problem>
- * SOLUTION: <Description of solution>
- * SEE: <List of relevant functions>
- * AUTHOR: <Person who wrote the fix>
- * POST: <Optional link to the original post where applicable>
- * FIXED IN: <Optional server version of official fix where applicable>
- *
- */
- #if defined _INC_SAMP_Community_fixes
- #endinput
- #endif
- #define _INC_SAMP_Community_fixes
- #if !defined _inc_fixes
- #define _inc_fixes
- #endif
- #define _FIXES_IS_UNSET(%0) ((2*%0-1+1)==-1)
- // We can add server version compiler code here to only compile fixes that apply
- // to the version of the includes for which the user is compiling.
- #if !defined FIX_GetPlayerColour
- #if defined FIX_GetPlayerColor
- #if _FIXES_IS_UNSET(FIX_GetPlayerColor)
- #define FIX_GetPlayerColour (2)
- #else
- #define FIX_GetPlayerColour (FIX_GetPlayerColor)
- #endif
- #else
- #define FIX_GetPlayerColour (1)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_GetPlayerColour)
- #undef FIX_GetPlayerColour
- #define FIX_GetPlayerColour (2)
- #endif
- #if !defined FIX_FILTERSCRIPT
- #define FIX_FILTERSCRIPT (1)
- #elseif _FIXES_IS_UNSET(FIX_FILTERSCRIPT)
- #undef FIX_FILTERSCRIPT
- #define FIX_FILTERSCRIPT (2)
- #endif
- #if !defined FIX_SpawnPlayer
- #define FIX_SpawnPlayer (1)
- #elseif _FIXES_IS_UNSET(FIX_SpawnPlayer)
- #undef FIX_SpawnPlayer
- #define FIX_SpawnPlayer (2)
- #endif
- #if !defined FIX_SetPlayerName
- #define FIX_SetPlayerName (1)
- #elseif _FIXES_IS_UNSET(FIX_SetPlayerName)
- #undef FIX_SetPlayerName
- #define FIX_SetPlayerName (2)
- #endif
- #if !defined FIX_GetPlayerSkin
- #define FIX_GetPlayerSkin (1)
- #elseif _FIXES_IS_UNSET(FIX_GetPlayerSkin)
- #undef FIX_GetPlayerSkin
- #define FIX_GetPlayerSkin (2)
- #endif
- #if !defined FIX_GetWeaponName
- #define FIX_GetWeaponName (1)
- #elseif _FIXES_IS_UNSET(FIX_GetWeaponName)
- #undef FIX_GetWeaponName
- #define FIX_GetWeaponName (2)
- #endif
- #if !defined FIX_SetPlayerWorldBounds
- #define FIX_SetPlayerWorldBounds (1)
- #elseif _FIXES_IS_UNSET(FIX_SetPlayerWorldBounds)
- #undef FIX_SetPlayerWorldBounds
- #define FIX_SetPlayerWorldBounds (2)
- #endif
- #if !defined FIX_TogglePlayerControllable
- #if defined SetObjectMaterial
- #define FIX_TogglePlayerControllable (0)
- #else
- #define FIX_TogglePlayerControllable (1)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable)
- #undef FIX_TogglePlayerControllable
- #define FIX_TogglePlayerControllable (2)
- #endif
- #if !defined FIX_HydraSniper
- #define FIX_HydraSniper (1)
- #elseif _FIXES_IS_UNSET(FIX_HydraSniper)
- #undef FIX_HydraSniper
- #define FIX_HydraSniper (2)
- #endif
- #if !defined FIX_IsPlayerInCheckpoint
- #define FIX_IsPlayerInCheckpoint (1)
- #elseif _FIXES_IS_UNSET(FIX_IsPlayerInCheckpoint)
- #undef FIX_IsPlayerInCheckpoint
- #define FIX_IsPlayerInCheckpoint (2)
- #endif
- #if !defined FIX_IsPlayerInRaceCheckpoint
- #define FIX_IsPlayerInRaceCheckpoint (1)
- #elseif _FIXES_IS_UNSET(FIX_IsPlayerInRaceCheckpoint)
- #undef FIX_IsPlayerInRaceCheckpoint
- #define FIX_IsPlayerInRaceCheckpoint (2)
- #endif
- #if !defined FIX_GetPlayerWeapon
- #define FIX_GetPlayerWeapon (1)
- #elseif _FIXES_IS_UNSET(FIX_GetPlayerWeapon)
- #undef FIX_GetPlayerWeapon
- #define FIX_GetPlayerWeapon (2)
- #endif
- #if !defined FIX_PutPlayerInVehicle
- #define FIX_PutPlayerInVehicle (1)
- #elseif _FIXES_IS_UNSET(FIX_PutPlayerInVehicle)
- #undef FIX_PutPlayerInVehicle
- #define FIX_PutPlayerInVehicle (2)
- #endif
- #if !defined FIX_KEY_AIM
- #if defined KEY_AIM
- #define FIX_KEY_AIM (0)
- #else
- #define FIX_KEY_AIM (1)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_KEY_AIM)
- #undef FIX_KEY_AIM
- #define FIX_KEY_AIM (2)
- #endif
- #if !defined FIX_SPECIAL_ACTION_PISSING
- #if defined SPECIAL_ACTION_PISSING
- #define FIX_SPECIAL_ACTION_PISSING (0)
- #else
- #define FIX_SPECIAL_ACTION_PISSING (1)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_SPECIAL_ACTION_PISSING)
- #undef FIX_SPECIAL_ACTION_PISSING
- #define FIX_SPECIAL_ACTION_PISSING (2)
- #endif
- #if !defined FIX_Natives
- #define FIX_Natives (1)
- #elseif _FIXES_IS_UNSET(FIX_Natives)
- #undef FIX_Natives
- #define FIX_Natives (2)
- #endif
- #if !defined FIX_IsValidVehicle
- #if defined IsValidVehicle
- #define FIX_IsValidVehicle (0)
- #else
- #define FIX_IsValidVehicle (FIX_Natives)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_IsValidVehicle)
- #undef FIX_IsValidVehicle
- #define FIX_IsValidVehicle (2)
- #endif
- #if !defined FIX_GetGravity
- #if defined GetGravity
- #define FIX_GetGravity (0)
- #else
- #define FIX_GetGravity (FIX_Natives)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_GetGravity)
- #undef FIX_GetGravity
- #define FIX_GetGravity (2)
- #endif
- #if !defined FIX_gpci
- #if defined gpci
- #define FIX_gpci (0)
- #else
- #define FIX_gpci (FIX_Natives)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_gpci)
- #undef FIX_gpci
- #define FIX_gpci (2)
- #endif
- #if !defined FIX_BODYPARTS
- #if defined BODY_PART_TORSO
- #define FIX_BODYPARTS (0)
- #else
- #define FIX_BODYPARTS (1)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_BODYPARTS)
- #undef FIX_BODYPARTS
- #define FIX_BODYPARTS (2)
- #endif
- #if !defined FIX_CAMERAMODES
- #if defined CAM_MODE_NONE
- #define FIX_CAMERAMODES (0)
- #else
- #define FIX_CAMERAMODES (1)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_CAMERAMODES)
- #undef FIX_CAMERAMODES
- #define FIX_CAMERAMODES (2)
- #endif
- #if !defined FIX_DriveBy
- #define FIX_DriveBy (1)
- #elseif _FIXES_IS_UNSET(FIX_DriveBy)
- #undef FIX_DriveBy
- #define FIX_DriveBy (2)
- #endif
- #if !defined FIX_SetPlayerCheckpoint
- #define FIX_SetPlayerCheckpoint (1)
- #elseif _FIXES_IS_UNSET(FIX_SetPlayerCheckpoint)
- #undef FIX_SetPlayerCheckpoint
- #define FIX_SetPlayerCheckpoint (2)
- #endif
- #if !defined FIX_SetPlayerRaceCheckpoint
- #define FIX_SetPlayerRaceCheckpoint (1)
- #elseif _FIXES_IS_UNSET(FIX_SetPlayerRaceCheckpoint)
- #undef FIX_SetPlayerRaceCheckpoint
- #define FIX_SetPlayerRaceCheckpoint (2)
- #endif
- #if !defined FIX_TextDrawCreate
- #define FIX_TextDrawCreate (1)
- #elseif _FIXES_IS_UNSET(FIX_TextDrawCreate)
- #undef FIX_TextDrawCreate
- #define FIX_TextDrawCreate (2)
- #endif
- #if !defined FIX_TextDrawSetString
- #define FIX_TextDrawSetString (1)
- #elseif _FIXES_IS_UNSET(FIX_TextDrawSetString)
- #undef FIX_TextDrawSetString
- #define FIX_TextDrawSetString (2)
- #endif
- #if !defined FIX_AllowInteriorWeapons
- #define FIX_AllowInteriorWeapons (1)
- #elseif _FIXES_IS_UNSET(FIX_AllowInteriorWeapons)
- #undef FIX_AllowInteriorWeapons
- #define FIX_AllowInteriorWeapons (2)
- #endif
- #if !defined FIX_OnPlayerEnterVehicle
- #if defined OnPlayerClickMap
- #define FIX_OnPlayerEnterVehicle (0)
- #else
- #define FIX_OnPlayerEnterVehicle (1)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle)
- #undef FIX_OnPlayerEnterVehicle
- #define FIX_OnPlayerEnterVehicle (2)
- #endif
- #if !defined FIX_OnPlayerEnterVehicle_2
- #define FIX_OnPlayerEnterVehicle_2 (1)
- #elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle)
- #undef FIX_OnPlayerEnterVehicle_2
- #define FIX_OnPlayerEnterVehicle_2 (2)
- #endif
- #if !defined FIX_AllowTeleport
- #if defined OnPlayerClickMap
- #define FIX_AllowTeleport (1)
- #else
- #define FIX_AllowTeleport (0)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_AllowTeleport)
- #undef FIX_AllowTeleport
- #define FIX_AllowTeleport (2)
- #endif
- #if !defined FIX_SetPlayerSpecialAction
- #define FIX_SetPlayerSpecialAction (1)
- #elseif _FIXES_IS_UNSET(FIX_SetPlayerSpecialAction)
- #undef FIX_SetPlayerSpecialAction
- #define FIX_SetPlayerSpecialAction (2)
- #endif
- #if !defined FIX_ClearAnimations
- #define FIX_ClearAnimations (1)
- #elseif _FIXES_IS_UNSET(FIX_ClearAnimations)
- #undef FIX_ClearAnimations
- #define FIX_ClearAnimations (2)
- #endif
- #if !defined FIX_ClearAnimations_2
- #define FIX_ClearAnimations_2 (1)
- #elseif _FIXES_IS_UNSET(FIX_ClearAnimations_2)
- #undef FIX_ClearAnimations_2
- #define FIX_ClearAnimations_2 (2)
- #endif
- #if !defined FIX_GangZoneCreate
- #define FIX_GangZoneCreate (1)
- #elseif _FIXES_IS_UNSET(FIX_GangZoneCreate)
- #undef FIX_GangZoneCreate
- #define FIX_GangZoneCreate (2)
- #endif
- #if !defined FIX_OnDialogResponse
- #if defined GetVehicleModelInfo
- #define FIX_OnDialogResponse (0)
- #else
- #define FIX_OnDialogResponse (1)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_OnDialogResponse)
- #undef FIX_OnDialogResponse
- #define FIX_OnDialogResponse (2)
- #endif
- #if !defined FIX_GetPlayerDialog
- #define FIX_GetPlayerDialog (0)
- #elseif _FIXES_IS_UNSET(FIX_GetPlayerDialog)
- #undef FIX_GetPlayerDialog
- #define FIX_GetPlayerDialog (2)
- #endif
- #if !defined FIX_PlayerDialogResponse
- #define FIX_PlayerDialogResponse (1)
- #elseif _FIXES_IS_UNSET(FIX_PlayerDialogResponse)
- #undef FIX_PlayerDialogResponse
- #define FIX_PlayerDialogResponse (2)
- #endif
- #if !defined FIX_SetSpawnInfo
- #if defined GetPlayerVersion
- #define FIX_SetSpawnInfo (0)
- #else
- #define FIX_SetSpawnInfo (1)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_SetSpawnInfo)
- #undef FIX_SetSpawnInfo
- #define FIX_SetSpawnInfo (2)
- #endif
- #if !defined FIX_SetPlayerSkin
- #define FIX_SetPlayerSkin (1)
- #elseif _FIXES_IS_UNSET(FIX_SetPlayerSkin)
- #undef FIX_SetPlayerSkin
- #define FIX_SetPlayerSkin (2)
- #endif
- #if !defined FIX_HideMenuForPlayer
- #define FIX_HideMenuForPlayer (1)
- #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer)
- #undef FIX_HideMenuForPlayer
- #define FIX_HideMenuForPlayer (2)
- #endif
- #if !defined FIX_valstr
- #define FIX_valstr (1)
- #elseif _FIXES_IS_UNSET(FIX_valstr)
- #undef FIX_valstr
- #define FIX_valstr (2)
- #endif
- #if !defined FIX_file_inc
- #define FIX_file_inc (0)
- #elseif _FIXES_IS_UNSET(FIX_file_inc)
- #undef FIX_file_inc
- #define FIX_file_inc (2)
- #endif
- #if !defined FIX_fclose
- #define FIX_fclose (FIX_file_inc)
- #elseif _FIXES_IS_UNSET(FIX_fclose)
- #undef FIX_fclose
- #define FIX_fclose (2)
- #endif
- #if !defined FIX_fwrite
- #define FIX_fwrite (FIX_file_inc)
- #elseif _FIXES_IS_UNSET(FIX_fwrite)
- #undef FIX_fwrite
- #define FIX_fwrite (2)
- #endif
- #if !defined FIX_fread
- #define FIX_fread (FIX_file_inc)
- #elseif _FIXES_IS_UNSET(FIX_fread)
- #undef FIX_fread
- #define FIX_fread (2)
- #endif
- #if !defined FIX_fputchar
- #define FIX_fputchar (FIX_file_inc)
- #elseif _FIXES_IS_UNSET(FIX_fputchar)
- #undef FIX_fputchar
- #define FIX_fputchar (2)
- #endif
- #if !defined FIX_fgetchar
- #define FIX_fgetchar (FIX_file_inc)
- #elseif _FIXES_IS_UNSET(FIX_fgetchar)
- #undef FIX_fgetchar
- #define FIX_fgetchar (2)
- #endif
- #if !defined FIX_fblockwrite
- #define FIX_fblockwrite (FIX_file_inc)
- #elseif _FIXES_IS_UNSET(FIX_fblockwrite)
- #undef FIX_fblockwrite
- #define FIX_fblockwrite (2)
- #endif
- #if !defined FIX_fblockread
- #define FIX_fblockread (FIX_file_inc)
- #elseif _FIXES_IS_UNSET(FIX_fblockread)
- #undef FIX_fblockread
- #define FIX_fblockread (2)
- #endif
- #if !defined FIX_fseek
- #define FIX_fseek (FIX_file_inc)
- #elseif _FIXES_IS_UNSET(FIX_fseek)
- #undef FIX_fseek
- #define FIX_fseek (2)
- #endif
- #if !defined FIX_flength
- #define FIX_flength (FIX_file_inc)
- #elseif _FIXES_IS_UNSET(FIX_flength)
- #undef FIX_flength
- #define FIX_flength (2)
- #endif
- #if !defined FIX_IsPlayerAttachedObjSlotUsed
- #define FIX_IsPlayerAttachedObjSlotUsed (1)
- #elseif _FIXES_IS_UNSET(FIX_IsPlayerAttachedObjSlotUsed)
- #undef FIX_IsPlayerAttachedObjSlotUsed
- #define FIX_IsPlayerAttachedObjSlotUsed (2)
- #endif
- #if !defined FIX_SetPlayerAttachedObject
- #define FIX_SetPlayerAttachedObject (1)
- #elseif _FIXES_IS_UNSET(FIX_SetPlayerAttachedObject)
- #undef FIX_SetPlayerAttachedObject
- #define FIX_SetPlayerAttachedObject (2)
- #endif
- #if !defined FIX_OnPlayerDeath
- #define FIX_OnPlayerDeath (1)
- #elseif _FIXES_IS_UNSET(FIX_OnPlayerDeath)
- #undef FIX_OnPlayerDeath
- #define FIX_OnPlayerDeath (2)
- #endif
- #if !defined FIX_strins
- #define FIX_strins (1)
- #elseif _FIXES_IS_UNSET(FIX_strins)
- #undef FIX_strins
- #define FIX_strins (2)
- #endif
- #if !defined FIX_IsPlayerConnected
- #define FIX_IsPlayerConnected (1)
- #elseif _FIXES_IS_UNSET(FIX_IsPlayerConnected)
- #undef FIX_IsPlayerConnected
- #define FIX_IsPlayerConnected (2)
- #endif
- #if !defined FIX_OnPlayerCommandText
- #define FIX_OnPlayerCommandText (1)
- #elseif _FIXES_IS_UNSET(FIX_OnPlayerCommandText)
- #undef FIX_OnPlayerCommandText
- #define FIX_OnPlayerCommandText (2)
- #endif
- #if !defined FIX_TrainExit
- #define FIX_TrainExit (1)
- #elseif _FIXES_IS_UNSET(FIX_TrainExit)
- #undef FIX_TrainExit
- #define FIX_TrainExit (2)
- #endif
- #if !defined FIX_Kick
- #if defined EnableVehicleFriendlyFire
- #define FIX_Kick (0)
- #else
- #define FIX_Kick (1)
- #endif
- #elseif _FIXES_IS_UNSET(FIX_Kick)
- #undef FIX_Kick
- #define FIX_Kick (2)
- #endif
- #if !defined FIX_OnVehicleMod
- #define FIX_OnVehicleMod (1)
- #elseif _FIXES_IS_UNSET(FIX_OnVehicleMod)
- #undef FIX_OnVehicleMod
- #define FIX_OnVehicleMod (2)
- #endif
- #if !defined FIX_random
- #define FIX_random (0)
- #elseif _FIXES_IS_UNSET(FIX_random)
- #undef FIX_random
- #define FIX_random (2)
- #endif
- #if !defined FIX_sleep
- #define FIX_sleep (1)
- #elseif _FIXES_IS_UNSET(FIX_sleep)
- #undef FIX_sleep
- #define FIX_sleep (2)
- #endif
- #if !defined FIX_Menus
- #define FIX_Menus (1)
- #elseif _FIXES_IS_UNSET(FIX_Menus)
- #undef FIX_Menus
- #define FIX_Menus (2)
- #endif
- #if !defined FIX_AddMenuItem
- #define FIX_AddMenuItem (FIX_Menus)
- #elseif _FIXES_IS_UNSET(FIX_AddMenuItem)
- #undef FIX_AddMenuItem
- #define FIX_AddMenuItem (2)
- #endif
- #if !defined FIX_SetMenuColumnHeader
- #define FIX_SetMenuColumnHeader (FIX_Menus)
- #elseif _FIXES_IS_UNSET(FIX_SetMenuColumnHeader)
- #undef FIX_SetMenuColumnHeader
- #define FIX_SetMenuColumnHeader (2)
- #endif
- #if !defined FIX_ShowMenuForPlayer
- #define FIX_ShowMenuForPlayer (FIX_Menus)
- #elseif _FIXES_IS_UNSET(FIX_ShowMenuForPlayer)
- #undef FIX_ShowMenuForPlayer
- #define FIX_ShowMenuForPlayer (2)
- #endif
- #if !defined FIX_HideMenuForPlayer
- #define FIX_HideMenuForPlayer (FIX_Menus)
- #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer)
- #undef FIX_HideMenuForPlayer
- #define FIX_HideMenuForPlayer (2)
- #endif
- #if !defined FIX_GetPlayerMenu
- #define FIX_GetPlayerMenu (1)
- #elseif _FIXES_IS_UNSET(FIX_GetPlayerMenu)
- #undef FIX_GetPlayerMenu
- #define FIX_GetPlayerMenu (2)
- #endif
- #if !defined FIX_HideMenuForPlayer_2
- #define FIX_HideMenuForPlayer_2 (0)
- #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer_2)
- #undef FIX_HideMenuForPlayer_2
- #define FIX_HideMenuForPlayer_2 (2)
- #elseif FIX_HideMenuForPlayer_2 && !FIX_GetPlayerMenu
- #error FIX_HideMenuForPlayer_2 requires FIX_GetPlayerMenu
- #endif
- #if !defined FIX_DisableMenu
- #define FIX_DisableMenu (FIX_Menus)
- #elseif _FIXES_IS_UNSET(FIX_DisableMenu)
- #undef FIX_DisableMenu
- #define FIX_DisableMenu (2)
- #endif
- #if !defined FIX_DisableMenuRow
- #define FIX_DisableMenuRow (FIX_Menus)
- #elseif _FIXES_IS_UNSET(FIX_DisableMenuRow)
- #undef FIX_DisableMenuRow
- #define FIX_DisableMenuRow (2)
- #endif
- #if FIX_Menus || FIX_AddMenuItem || FIX_SetMenuColumnHeader || FIX_ShowMenuForPlayer || FIX_HideMenuForPlayer || FIX_DisableMenu || FIX_DisableMenuRow
- #define _FIX_Menus (1)
- #else
- #define _FIX_Menus (2)
- #endif
- #if !defined FIX_GetPlayerInterior
- #define FIX_GetPlayerInterior (1)
- #elseif _FIXES_IS_UNSET(FIX_GetPlayerInterior)
- #undef FIX_GetPlayerInterior
- #define FIX_GetPlayerInterior (2)
- #endif
- #if !defined FIX_ApplyAnimation
- #define FIX_ApplyAnimation (1)
- #elseif _FIXES_IS_UNSET(FIX_ApplyAnimation)
- #undef FIX_ApplyAnimation
- #define FIX_ApplyAnimation (2)
- #endif
- #if !defined FIX_ApplyAnimation_2
- #define FIX_ApplyAnimation_2 (1)
- #elseif _FIXES_IS_UNSET(FIX_ApplyAnimation_2)
- #undef FIX_ApplyAnimation_2
- #define FIX_ApplyAnimation_2 (2)
- #endif
- #if !defined FIX_OnPlayerSpawn
- #define FIX_OnPlayerSpawn (1)
- #elseif _FIXES_IS_UNSET(FIX_OnPlayerSpawn)
- #undef FIX_OnPlayerSpawn
- #define FIX_OnPlayerSpawn (2)
- #endif
- #if !defined FIX_GameText
- #define FIX_GameText (1)
- #elseif _FIXES_IS_UNSET(FIX_GameText)
- #undef FIX_GameText
- #define FIX_GameText (2)
- #endif
- #if !defined FIX_HideGameText
- #define FIX_HideGameText (0)
- #elseif _FIXES_IS_UNSET(FIX_HideGameText)
- #undef FIX_HideGameText
- #define FIX_HideGameText (2)
- #endif
- #if !defined FIX_GameTextStyles
- #define FIX_GameTextStyles (0)
- #elseif _FIXES_IS_UNSET(FIX_GameTextStyles)
- #undef FIX_GameTextStyles
- #define FIX_GameTextStyles (2)
- #elseif FIX_GameTextStyles && !FIX_GameText
- #error FIX_GameTextStyles requires FIX_GameText
- #endif
- #if !defined FIX_OnPlayerConnect
- #define FIX_OnPlayerConnect (1)
- #elseif _FIXES_IS_UNSET(FIX_OnPlayerConnect)
- #undef FIX_OnPlayerConnect
- #define FIX_OnPlayerConnect (2)
- #endif
- #if !defined FIX_OnPlayerDisconnect
- #define FIX_OnPlayerDisconnect (1)
- #elseif _FIXES_IS_UNSET(FIX_OnPlayerDisconnect)
- #undef FIX_OnPlayerDisconnect
- #define FIX_OnPlayerDisconnect (2)
- #endif
- #if !defined FIX_CreatePlayerTextDraw
- #define FIX_CreatePlayerTextDraw (1)
- #elseif _FIXES_IS_UNSET(FIX_CreatePlayerTextDraw)
- #undef FIX_CreatePlayerTextDraw
- #define FIX_CreatePlayerTextDraw (2)
- #endif
- #if !defined FIX_PlayerTextDrawSetString
- #define FIX_PlayerTextDrawSetString (1)
- #elseif _FIXES_IS_UNSET(FIX_PlayerTextDrawSetString)
- #undef FIX_PlayerTextDrawSetString
- #define FIX_PlayerTextDrawSetString (2)
- #endif
- #if !defined FIX_SetPlayerCamera
- #define FIX_SetPlayerCamera (1)
- #elseif _FIXES_IS_UNSET(FIX_SetPlayerCamera)
- #undef FIX_SetPlayerCamera
- #define FIX_SetPlayerCamera (2)
- #endif
- #if !defined FIX_SetPlayerTime
- #define FIX_SetPlayerTime (1)
- #elseif _FIXES_IS_UNSET(FIX_SetPlayerTime)
- #undef FIX_SetPlayerTime
- #define FIX_SetPlayerTime (2)
- #endif
- #if !defined FIX_OnPlayerRequestClass
- #define FIX_OnPlayerRequestClass (1)
- #elseif _FIXES_IS_UNSET(FIX_OnPlayerRequestClass)
- #undef FIX_OnPlayerRequestClass
- #define FIX_OnPlayerRequestClass (2)
- #endif
- /*
- * CHAIN_ORDER
- *
- * Allows y_hooks to call things in the correct order when it exists.
- */
- #if !defined CHAIN_ORDER
- #define CHAIN_ORDER() 0
- #endif
- /*
- * PRE_HOOK
- *
- * A method of pre-hooking callbacks to still have them called before any ones
- * re-written by y_hooks.
- */
- #define PRE_HOOK(%0) forward @CO_%0();public @CO_%0(){return CHAIN_ORDER()+1;}
- PRE_HOOK(FIXES)
- #undef CHAIN_ORDER
- #define CHAIN_ORDER @CO_FIXES
- /*
- * _FIXES_IncludeStates
- *
- * Define the "_ALS" states used by hooks.
- */
- static stock _FIXES_IncludeStates() <_ALS : _ALS_x0, _ALS : _ALS_x1, _ALS : _ALS_x2, _ALS : _ALS_x3>
- {
- }
- static stock _FIXES_IncludeStates() <_ALS : _ALS_go>
- {
- }
- /*
- * FIXES_GT_STYLE_COUNT
- *
- * The number of GameText styles recreated using TextDraw functions. This is 4
- * by default, but can be extended to 6 if you want location and vehicle styles.
- */
- #if FIX_GameText
- #if FIX_GameTextStyles
- #define FIXES_GT_STYLE_COUNT (14)
- #else
- #define FIXES_GT_STYLE_COUNT (7)
- #endif
- #endif
- /*
- * FIXES_SilentKick
- *
- * If this define is set to 1, then players will not be given a message when
- * they are kicked for cheats, instead they will just loose connection to the
- * server.
- */
- #if !defined FIXES_SilentKick
- #define FIXES_SilentKick 0
- #elseif _FIXES_IS_UNSET(FIXES_SilentKick)
- #undef FIXES_SilentKick
- #define FIXES_SilentKick 2
- #endif
- /*
- * FIXES_Debug
- *
- * If this define is set to 1, then debug printing is turned on for any
- * functions which may use it. Otherwise, the compiler entirely removes the
- * code to print anything, leaving 0 run-time overhead.
- */
- #if defined FIXES_Debug
- #if _FIXES_IS_UNSET(FIXES_Debug)
- #undef FIXES_Debug
- #elseif FIXES_Debug == 1
- #define FIXES_PRINTF(%0); print(_FIXES_gIsFilterscript ? ("* FIXES_PRINTF (FS):") : ("* FIXES_PRINTF (GM):")),printf("*** " %0);
- #else
- #undef FIXES_Debug
- #endif
- #endif
- /*
- * FIXES_UseStateHooks
- *
- * A marker to indicate that this version of fixes.inc uses state-based hooks.
- */
- #define FIXES_UseStateHooks
- /*
- * FIXES_PRINTF
- *
- * A special "printf" function only compiled when "FIXES_Debug" is set.
- */
- #if !defined FIXES_PRINTF
- #define FIXES_Debug 0
- #define FIXES_PRINTF(%0);
- #endif
- /*
- * INVALID_DIALOG_ID
- *
- * Set when a player can't see a dialog.
- */
- #if !defined INVALID_DIALOG_ID
- #define INVALID_DIALOG_ID (-1)
- #endif
- /*
- * FIXES_Single
- *
- * If this define is set to 1, then the old style include is used, with no
- * support for multiple scripts running at the same time on the server (i.e. no
- * gamemodes and filter scripts at the same time). You can only have one or the
- * other or bugs.
- */
- #if !defined FIXES_Single
- #define FIXES_Single (1)
- #elseif _FIXES_IS_UNSET(FIXES_Single)
- #undef FIXES_Single
- #define FIXES_Single (2)
- #endif
- /*
- * _FIXES_IS_IN_CHARGE
- *
- * Test to see if this script is in command or not (master).
- */
- #if FIXES_Single
- #define _FIXES_IS_IN_CHARGE(%0)
- #else
- #define _FIXES_IS_IN_CHARGE(%0) if (%0(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
- #endif
- /*
- * E_FIXES_WORLDBOUND_DATA
- *
- * Store data for each player on their worldbound data.
- */
- enum E_FIXES_WORLDBOUND_DATA
- {
- // "Previous".
- Float:E_FIXES_WORLDBOUND_DATA_PX,
- Float:E_FIXES_WORLDBOUND_DATA_PY,
- Float:E_FIXES_WORLDBOUND_DATA_PZ,
- // "Lower".
- Float:E_FIXES_WORLDBOUND_DATA_LX,
- Float:E_FIXES_WORLDBOUND_DATA_LY,
- // "Upper".
- Float:E_FIXES_WORLDBOUND_DATA_UX,
- Float:E_FIXES_WORLDBOUND_DATA_UY
- }
- /*
- * e_FIXES_BOOLS
- *
- * Collection of boolean values for players, designed to collect multiple checks
- * in to one variable to reduce memory consumption.
- */
- enum e_FIXES_BOOLS (<<= 1)
- {
- // Handy definition for nothing set.
- e_FIXES_BOOLS_NONE = 0,
- // Does this player have worldbounds enabled?
- e_FIXES_BOOLS_WORLDBOUNDS = 1,
- e_FIXES_BOOLS_UNCONTROLLABLE,
- e_FIXES_BOOLS_PUT_IN_VEHICLE,
- e_FIXES_BOOLS_BLOCK,
- e_FIXES_BOOLS_TELEPORT,
- e_FIXES_BOOLS_CONNECTED,
- e_FIXES_BOOLS_INTERIOR,
- e_FIXES_BOOLS_PUT_IN_TRAIN,
- e_FIXES_BOOLS_KICKED,
- e_FIXES_BOOLS_ON_PLAYER_CONNECT,
- e_FIXES_BOOLS_DRIVE_BY,
- e_FIXES_BOOLS_FIRST_SPAWN,
- e_FIXES_BOOLS_FIRST_CLASS,
- e_FIXES_BOOLS_SPECTATING
- }
- /*
- * e_FIXES_SETTINGS
- *
- * Collection of boolean values for the script as a whole. Stores a variety of
- * settings that are true/false.
- */
- enum e_FIXES_SETTINGS (<<= 1)
- {
- // Handy definition for nothing set.
- e_FIXES_SETTINGS_NONE = 0,
- e_FIXES_SETTINGS_INTERIOR = 1,
- e_FIXES_SETTINGS_ADMIN_TELEPORT,
- e_FIXES_SETTINGS_IN_CHARGE,
- e_FIXES_SETTINGS_DROP_ALL_DATA,
- e_FIXES_SETTINGS_MENU_SET,
- e_FIXES_SETTINGS_ENDING,
- e_FIXES_SETTINGS_ENDED,
- e_FIXES_SETTINGS_NO_GAME_TEXT,
- e_FIXES_SETTINGS_SECOND_USE
- }
- /*
- * _FIXES_CEILDIV
- *
- * Do a ceiling division of the first number by the second number.
- */
- #define _FIXES_CEILDIV(%0,%1) (((%0) + (%1) - 1) / (%1))
- /*
- * _FIXES_INFINITY
- *
- * IEEE 754 definition of infinity.
- */
- #define _FIXES_INFINITY (Float:0x7F800000)
- /*
- * _FIXES_N_INFINITY
- *
- * IEEE 754 definition of negative infinity.
- */
- #define _FIXES_N_INFINITY (Float:0xFF800000)
- /*
- * _FIXES_ATTACHMENTS
- *
- * The number of players whose attachment data (10-bits) can be stored in one
- * cell.
- */
- #define _FIXES_ATTACHMENTS (cellbits / MAX_PLAYER_ATTACHED_OBJECTS)
- /*
- * _FIXES_FOREACH
- *
- * A new version of "foreach", but just for this library.
- */
- #define _FIXES_FOREACH(%1,%0) for (new %0 = MAX_PLAYERS; (%0 = %1[%0]) != MAX_PLAYERS; )
- /*
- * _FIXES_IN_RANGE
- *
- * Checks if the first parameter is between the other two: %1 <= %0 < %2 (but
- * faster).
- */
- #define _FIXES_IN_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) < ((%2) - ((%1) + cellmin)))
- /*
- * _FIXES_NO_RANGE
- *
- * Checks if the first parameter is not between the other two: !(%1 <= %0 < %2)
- * (but faster).
- */
- #define _FIXES_NO_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) >= ((%2) - ((%1) + cellmin)))
- /*
- * _FIXES_FORWARD
- *
- * Forwards a hooked callbacks, and defines the default state implementations.
- */
- #define _FIXES_FORWARD%0(%1); \
- forward%0(%1); \
- public%0(%1) <_ALS : _ALS_x0, _ALS : _ALS_x1> { return 1; } \
- public%0(%1) <> { return 1; }
- /*
- * _FIXES_IS_PLAYER_CONNECTED
- *
- * Always valid "IsPlayerConnected" check.
- */
- #define _FIXES_IS_PLAYER_CONNECTED(%0) (_FIXES_IN_RANGE((%0), 0, MAX_PLAYERS) && IsPlayerConnected((%0)))
- // These varaibles are NOT pre-processor dependent as they are stock. It's just
- // simpler than trying to figure out when or if a semi-colon is needed.
- #if !FIX_FILTERSCRIPT
- static
- #endif
- stock
- /*
- * bool:_FIXES_gIsFilterscript
- *
- * Runtime equivalent of "FILTERSCRIPT" for when it is not set by the user.
- */
- bool:_FIXES_gIsFilterscript;
- stock
- /*
- * FIXES_gscSpace[]
- *
- * A single re-usable space.
- */
- FIXES_gscSpace[] = " ";
- #if FIXES_Debug
- new
- #else
- static stock
- #endif
- /*
- * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)]
- *
- * A record of which menus have and haven't been shown yet. We ensure that
- * this only exists when required, since it depends on add and remove
- * functions to be called at the right time.
- */
- #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
- FIXES_gsPlayersIterator[MAX_PLAYERS + 1] = {0, 1, ...},
- #endif
- /*
- * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)]
- *
- * A record of which menus have and haven't been shown yet.
- */
- FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)],
- /*
- * FIXES_gsPlayerIP[MAX_PLAYERS]
- *
- * A player's IP as a 32-bit integer.
- */
- FIXES_gsPlayerIP[MAX_PLAYERS] = {-1, ...},
- /*
- * FIXES_gsPlayerSkin[MAX_PLAYERS]
- *
- * The skin the player is currently using.
- */
- FIXES_gsPlayerSkin[MAX_PLAYERS],
- /*
- * e_FIXES_BOOLEAN_DATA:FIXES_gsPlayerBools[MAX_PLAYERS]
- *
- * Collection of boolean values for players.
- */
- e_FIXES_BOOLS:FIXES_gsPlayerBools[MAX_PLAYERS],
- /*
- * FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA]
- *
- * All data for players on where their worldbounds are and where they last
- * were before they went through the bounds by crouching.
- */
- #if FIX_SetPlayerWorldBounds
- FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA],
- #endif
- /*
- * FIXES_gsPlayerWeapon[MAX_PLAYERS]
- *
- * Stores the weapon set by "SetPlayerArmedWeapon" when in a vehicle.
- */
- FIXES_gsPlayerWeapon[MAX_PLAYERS],
- /*
- * FIXES_gsVehicleSeatData[MAX_PLAYERS]
- *
- * What vehicle the player is due to go in.
- */
- FIXES_gsVehicleSeatData[MAX_PLAYERS],
- /*
- * FIXES_gsVehicleLocked[(MAX_PLAYERS * MAX_VEHICLES + cellbits - 1) / cellbits]
- *
- * Is this vehicle locked for a player. This is a compressed 2D binary
- * array, made by concatenating many bits together (saves 1kb-3kb)! Is
- * there a reason this array exists?
- */
- //FIXES_gsVehicleLocked[_FIXES_CEILDIV(MAX_PLAYERS * MAX_VEHICLES, cellbits)],
- /*
- * FIXES_gsDialogID[MAX_PLAYERS]
- *
- * Stores the true ID of the dialog the player is looking at to prevent
- * spoofing.
- */
- FIXES_gsDialogID[MAX_PLAYERS] = {-1, ...},
- /*
- * FIXES_gsInterior[MAX_PLAYERS]
- *
- * The player's current interior.
- */
- FIXES_gsInterior[MAX_PLAYERS],
- /*
- * e_FIXES_SETTINGS:FIXES_gsSettings
- *
- * A collection of 1-bit options, compressed together to save space.
- */
- e_FIXES_SETTINGS:FIXES_gsSettings = e_FIXES_SETTINGS_SECOND_USE,
- /*
- * FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)]
- *
- * A record of which attached object slots a player has used.
- */
- FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)],
- /*
- * FIXES_gsLastAnimation[MAX_PLAYERS]
- *
- * The last animation a player used.
- */
- FIXES_gsLastAnimation[MAX_PLAYERS],
- /*
- * FIXES_gsLastCash[MAX_PLAYERS]
- *
- * A player's cash before dying.
- */
- FIXES_gsLastCash[MAX_PLAYERS],
- /*
- * FIXES_gsDriveByWeapon[MAX_PLAYERS]
- *
- * The weapon to set after re-enter to vehicle.
- */
- FIXES_gsDriveByWeapon[MAX_PLAYERS],
- /*
- * FIXES_gsCurrentMenu[MAX_PLAYERS]
- *
- * The menu the player can currently see.
- */
- Menu:FIXES_gsCurrentMenu[MAX_PLAYERS] = {Menu:INVALID_MENU, ...},
- /*
- * Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT]
- *
- * The pre-defined TextDraw styles used to recreate the bugged GameText
- * styles for GameTextForAll.
- */
- #if FIX_GameText
- Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT],
- #endif
- /*
- * FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1]
- *
- * A linked list of which players can see a certain GameText style.
- */
- #if FIX_GameText
- FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1],
- #endif
- /*
- * PlayerText:FIXES_gsPGTStyle[FIXES_GT_STYLE_COUNT][MAX_PLAYERS]
- *
- * The predefined TextDraw styles used to recreate the bugged GameText
- * styles for GameTextForPlayer.
- */
- #if FIX_GameText
- PlayerText:FIXES_gsPGTStyle[MAX_PLAYERS][FIXES_GT_STYLE_COUNT],
- #endif
- /*
- * FIXES_gsPGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS]
- *
- * The timers used to hide per-player GameText messages.
- */
- #if FIX_GameText
- FIXES_gsGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1],
- #endif
- /*
- * FIXES_gsClassAnimTimer[MAX_PLAYERS],
- *
- * Used for storing the timer ID for deferring class selection animation
- * application.
- */
- FIXES_gsAnimTimer[MAX_PLAYERS],
- /*
- * FIXES_gsClassAnimName[MAX_PLAYERS][60],
- *
- * Used for storing the animation name.
- */
- #if FIX_ApplyAnimation_2
- FIXES_gsClassAnimName[MAX_PLAYERS][60],
- #endif
- /*
- * FIXES_gsPlayerAnimLibs[MAX_PLAYERS][_FIXES_CEILDIV(134, cellbits)],
- *
- * Which animation libraries the player has synced.
- */
- #if FIX_ApplyAnimation_2
- FIXES_gsPlayerAnimLibs[MAX_PLAYERS][_FIXES_CEILDIV(134, cellbits)],
- #endif
- /*
- * FIXES_pvarNotNewPlayer[]
- *
- * This variable records wether or not this player is brand new to the
- * server, and not just having "OnPlayerConnect" called due to a script
- * load. There are certain functions that need applying only the very first
- * time they connect, then this gets set.
- */
- FIXES_pvarNotNewPlayer[] = "FIXES_pvarNotNewPlayer",
- /*
- * FIXES_pvarPlayerWeapon[]
- *
- * Name of the pvar in which to store the player's current weapon.
- */
- FIXES_pvarPlayerWeapon[] = "FIXES_pvarPlayerWeapon",
- /*
- * FIXES_pvarPlayerSkin[]
- *
- * Name of the pvar in which to store the player's current skin.
- */
- FIXES_pvarPlayerSkin[] = "FIXES_pvarPlayerSkin",
- /*
- * FIXES_pvarPlayerSpectate[]
- *
- * Name of the pvar in which to store the player's spectator mode.
- */
- FIXES_pvarPlayerSpectate[] = "FIXES_pvarPlayerSpectate",
- /*
- * FIXES_gscKick[]
- *
- * Name of the kick timer function.
- */
- FIXES_gscKick[] = "_FIXES_Kick",
- /*
- * FIXES_pvarKick[]
- *
- * Name of the pvar in which to store a player's kick timer.
- */
- FIXES_pvarKick[] = "FIXES_pvarKick",
- /*
- * FIXES_pvarPlayerDialog[]
- *
- * Name of the pvar in which to store the player's current dialogid.
- */
- FIXES_pvarPlayerDialog[] = "FIXES_pvarPlayerDialog",
- /*
- * FIXES_pvarPlayerInterior[]
- *
- * A player's current interior.
- */
- FIXES_pvarPlayerInterior[] = "FIXES_pvarPlayerInterior",
- /*
- * FIXES_pvarCurrentDialog[]
- *
- * Used in OnDialogResponse to be able to get the correct ID in multiple
- * scripts while still correctly resetting the ID for future use.
- */
- FIXES_pvarCurrentDialog[] = "FIXES_pvarCurrentDialog",
- /*
- * FIXES_pvarPlayerLastCash[]
- *
- * Used in OnPlayerDeath to save a player's cash before death.
- */
- FIXES_pvarPlayerLastCash[] = "FIXES_pvarPlayerLastCash",
- /*
- * FIXES_gscHideGameTextTimer[]
- *
- * Name of the GameText hide timer function.
- */
- FIXES_gscHideGameTextTimer[] = "_FIXES_HideGameTextTimer",
- /*
- * FIXES_gscDriveBy[]
- *
- * Name of the Drive-By timer function.
- */
- FIXES_gscDriveBy[] = "_FIXES_DriveBy",
- /*
- * FIXES_gscSetCamera[]
- *
- * Name of the SetCamera timer function.
- */
- FIXES_gscSetCamera[] = "_FIXES_SetCamera",
- /*
- * FIXES_gscSetTime[]
- *
- * Name of the SetTime timer function.
- */
- FIXES_gscSetTime[] = "_FIXES_SetTime",
- /*
- * FIXES_gscNULL[]
- *
- * NULL. This is stored as a global string to reduce memory usage.
- */
- FIXES_gscNULL[] = "\1";
- static stock const
- /*
- * FIXES_gscPlayerColours[100]
- *
- * There are only 100 colours used by default, with SA:MP looping through
- * them repeatedly.
- */
- #if FIX_GetPlayerColour
- FIXES_gscPlayerColours[100] =
- {
- 0xFF8C13FF, 0xC715FFFF, 0x20B2AAFF, 0xDC143CFF, 0x6495EDFF,
- 0xF0E68CFF, 0x778899FF, 0xFF1493FF, 0xF4A460FF, 0xEE82EEFF,
- 0xFFD720FF, 0x8B4513FF, 0x4949A0FF, 0x148B8BFF, 0x14FF7FFF,
- 0x556B2FFF, 0x0FD9FAFF, 0x10DC29FF, 0x534081FF, 0x0495CDFF,
- 0xEF6CE8FF, 0xBD34DAFF, 0x247C1BFF, 0x0C8E5DFF, 0x635B03FF,
- 0xCB7ED3FF, 0x65ADEBFF, 0x5C1ACCFF, 0xF2F853FF, 0x11F891FF,
- 0x7B39AAFF, 0x53EB10FF, 0x54137DFF, 0x275222FF, 0xF09F5BFF,
- 0x3D0A4FFF, 0x22F767FF, 0xD63034FF, 0x9A6980FF, 0xDFB935FF,
- 0x3793FAFF, 0x90239DFF, 0xE9AB2FFF, 0xAF2FF3FF, 0x057F94FF,
- 0xB98519FF, 0x388EEAFF, 0x028151FF, 0xA55043FF, 0x0DE018FF,
- 0x93AB1CFF, 0x95BAF0FF, 0x369976FF, 0x18F71FFF, 0x4B8987FF,
- 0x491B9EFF, 0x829DC7FF, 0xBCE635FF, 0xCEA6DFFF, 0x20D4ADFF,
- 0x2D74FDFF, 0x3C1C0DFF, 0x12D6D4FF, 0x48C000FF, 0x2A51E2FF,
- 0xE3AC12FF, 0xFC42A8FF, 0x2FC827FF, 0x1A30BFFF, 0xB740C2FF,
- 0x42ACF5FF, 0x2FD9DEFF, 0xFAFB71FF, 0x05D1CDFF, 0xC471BDFF,
- 0x94436EFF, 0xC1F7ECFF, 0xCE79EEFF, 0xBD1EF2FF, 0x93B7E4FF,
- 0x3214AAFF, 0x184D3BFF, 0xAE4B99FF, 0x7E49D7FF, 0x4C436EFF,
- 0xFA24CCFF, 0xCE76BEFF, 0xA04E0AFF, 0x9F945CFF, 0xDCDE3DFF,
- 0x10C9C5FF, 0x70524DFF, 0x0BE472FF, 0x8A2CD7FF, 0x6152C2FF,
- 0xCF72A9FF, 0xE59338FF, 0xEEDC2DFF, 0xD8C762FF, 0xD8C762FF
- },
- #endif
- /*
- * FIXES_gscMaxPassengers[]
- *
- * This is a compressed (4-bit) list of the maximum number of passengers in
- * any vehicle, confirmed by a number of sources. "F" (15) means invalid
- * vehicle.
- */
- #if FIX_OnPlayerEnterVehicle
- FIXES_gscMaxPassengers[] =
- {
- 0x10331113, 0x11311131, 0x11331313, 0x80133301, 0x1381F110, 0x10311103, 0x10001F10, 0x11113311, 0x13113311,
- 0x31101100, 0x30001301, 0x11031311, 0x11111331, 0x10013111, 0x01131100, 0x11111110, 0x11100031, 0x11130221,
- 0x33113311, 0x11111101, 0x33101133, 0x101001F0, 0x03133111, 0xFF11113F, 0x13330111, 0xFF131111, 0x0000FF3F
- },
- #endif
- /*
- * FIXES_gscVehicleMods[]
- *
- * This is a bit array of all the valid mods (-1000) for all vehicles (-400)
- * EXCEPT for vehicle 576 (Tornado), which has just TWO extra mods on it,
- * that should spill over in to an extra cell of data (requiring an extra
- * 848 bytes of data total to make the array work). Instead this (hopefully
- * rare) case is handled explicitly in "OnVehicleMod". It seems that most
- * vehicles are:
- *
- * 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- *
- * I don't know yet if this can be used to our advantage to improve the code
- * somehow - it seems like that would require more explicit model handling.
- */
- #if FIX_OnVehicleMod
- FIXES_gscVehicleMods[] =
- {
- 0x033C2700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x021A27FA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x023B2785, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02BC4703, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x03BA278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x028E078A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02310744, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x0228073A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02BD4701, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x023A2780, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x0228077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x027A27CA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x0282278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x023E07C0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x03703730, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x031D2775, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02BE4788, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x02010771, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x029A0FCE, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x03382700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x023F8795, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x029F078C, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x029627EA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x0236C782, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x029E1FCA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0xFC000437, 0x00000000, 0x021C0000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x03FE6007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00001B87, 0x00000001, 0x01E00000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x039E07D2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x023CC700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x038E07D6, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x023D0709, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x029E1F8A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x029C077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x02BD076C, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0xFFFFFE00, 0x00000007, 0x00000000, 0x000001F8,
- 0x02000700, 0x00000000, 0x00FFFFFE, 0x00000007, 0xC0000000, 0x00002007,
- 0xFE000700, 0x00000003, 0x00FFFE00, 0x00000007, 0x00003C00, 0x00000600,
- 0xCE000700, 0xFF800000, 0x00FFFE01, 0x00000007, 0x3C000000, 0x00000000,
- 0x02000700, 0x000003FC, 0x00FFFE00, 0x00000007, 0x003C0000, 0x00001800,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x007FE000, 0x00FFFE00, 0x00000007, 0x03C00000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000047, 0x0000003E, 0x3C000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00001C00, 0x00FFFE00, 0x0000000F, 0x00000000, 0x0003C000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x000003C0, 0xC0000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x029607C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x03FFE7CD, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x031727F1, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x025627F0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x039E07C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
- 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000
- },
- #endif
- /*
- * FIXES_gscAnimIndexes[]
- *
- * Which index each letter starts at. Sometimes crashes the compiler...
- */
- #if FIX_ApplyAnimation || FIX_ApplyAnimation_2
- FIXES_gscAnimIndexes[24] =
- {
- 0, 2, 21, 35, 42, 42, 53, 62, 64, 67, 68, 71, 75, 81, 82, 84, 94, 96, 104, 121, 126, 127, 130, 134
- },
- #endif
- /*
- * FIXES_gscAnimLib[]
- *
- * List of valid animation libraries.
- */
- #if FIX_ApplyAnimation || FIX_ApplyAnimation_2
- FIXES_gscAnimLib[134][] =
- {
- "AIRPORT", "ATTRACTORS", "BAR", "BASEBALL", "BD_FIRE",
- "BEACH", "BENCHPRESS", "BF_INJECTION", "BIKE_DBZ", "BIKED",
- "BIKEH", "BIKELEAP", "BIKES", "BIKEV", "BLOWJOBZ",
- "BMX", "BOMBER", "BOX", "BSKTBALL", "BUDDY",
- "BUS", "CAMERA", "CAR", "CAR_CHAT", "CARRY",
- "CASINO", "CHAINSAW", "CHOPPA", "CLOTHES", "COACH",
- "COLT45", "COP_AMBIENT", "COP_DVBYZ", "CRACK", "CRIB",
- "DAM_JUMP", "DANCING", "DEALER", "DILDO", "DODGE",
- "DOZER", "DRIVEBYS", "FAT", "FIGHT_B", "FIGHT_C",
- "FIGHT_D", "FIGHT_E", "FINALE", "FINALE2", "FLAME",
- "FLOWERS", "FOOD", "FREEWEIGHTS", "GANGS", "GFUNK",
- "GHANDS", "GHETTO_DB", "GOGGLES", "GRAFFITI", "GRAVEYARD",
- "GRENADE", "GYMNASIUM", "HAIRCUTS", "HEIST9", "INT_HOUSE",
- "INT_OFFICE", "INT_SHOP", "JST_BUISNESS", "KART", "KISSING",
- "KNIFE", "LAPDAN1", "LAPDAN2", "LAPDAN3", "LOWRIDER",
- "MD_CHASE", "MD_END", "MEDIC", "MISC", "MTB",
- "MUSCULAR", "NEVADA", "ON_LOOKERS", "OTB", "PARACHUTE",
- "PARK", "PAULNMAC", "PED", "PLAYER_DVBYS", "PLAYIDLES",
- "POLICE", "POOL", "POOR", "PYTHON", "QUAD",
- "QUAD_DBZ", "RAPPING", "RIFLE", "RIOT", "ROB_BANK",
- "ROCKET", "RUNNINGMAN", "RUSTLER", "RYDER", "SCRATCHING",
- "SEX", "SHAMAL", "SHOP", "SHOTGUN", "SILENCED",
- "SKATE", "SMOKING", "SNIPER", "SNM", "SPRAYCAN",
- "STRIP", "SUNBATHE", "SWAT", "SWEET", "SWIM",
- "SWORD", "TANK", "TATTOOS", "TEC", "TRAIN",
- "TRUCK", "UZI", "VAN", "VENDING", "VORTEX",
- "WAYFARER", "WEAPONS", "WOP", "WUZI"
- },
- #endif
- /*
- * FIXES_gscDot[]
- *
- * ".".
- */
- FIXES_gscDot[] = ".",
- /*
- * FIXES_gscSpec@[]
- *
- * Specifier "".
- */
- FIXES_gscSpec@[] = "",
- /*
- * FIXES_gscSpec@i[]
- *
- * Specifier "i".
- */
- FIXES_gscSpec@i[] = "i",
- /*
- * FIXES_gscSpec@ii[]
- *
- * Specifier "ii".
- */
- FIXES_gscSpec@ii[] = "ii",
- /*
- * FIXES_gscSpec@ai[]
- *
- * Specifier "ai".
- */
- FIXES_gscSpec@ai[] = "ai",
- /*
- * FIXES_gscSpec@is[]
- *
- * Specifier "is".
- */
- FIXES_gscSpec@is[] = "is",
- /*
- * FIXES_gscSpec@iii[]
- *
- * Specifier "iii".
- */
- FIXES_gscSpec@iii[] = "iii",
- /*
- * FIXES_gscSpec@isii[]
- *
- * Specifier "isii".
- */
- FIXES_gscSpec@isii[] = "isii",
- /*
- * FIXES_gscSpec@ifff[]
- *
- * Specifier "ifff".
- */
- FIXES_gscSpec@ifff[] = "ifff",
- /*
- * FIXES_gscSpec@iifff[]
- *
- * Specifier "iifff".
- */
- FIXES_gscSpec@iifff[] = "iifff",
- /*
- * FIXES_gscSpec@iffff[]
- *
- * Specifier "iffff".
- */
- FIXES_gscSpec@iffff[] = "iffff",
- /*
- * FIXES_gscSpec@iiiis[]
- *
- * Specifier "iiiis".
- */
- FIXES_gscSpec@iiiis[] = "iiiis",
- /*
- * FIXES_gscSpec@iiiii[]
- *
- * Specifier "iiiii".
- */
- FIXES_gscSpec@iiiii[] = "iiiii",
- /*
- * FIXES_gscSpec@iiiiii[]
- *
- * Specifier "iiiiii".
- */
- FIXES_gscSpec@iiiiii[] = "iiiiii",
- /*
- * FIXES_gscTempName[]
- *
- * The temporary name to give when renaming people.
- */
- FIXES_gscTempName[] = "FIXES_TEMP_NAME",
- /*
- * FIXES_gscOrderProperty[]
- *
- * The property to check for script ordering.
- */
- FIXES_gscOrderProperty[] = "FIXES_gscOrderProperty",
- /*
- * FIXES_gscNoGMProperty[]
- *
- * Call "_FIXES_DetermineOrder" in the GM or not?
- */
- FIXES_gscNoGMProperty[] = "FIXES_gscNoGMProperty",
- /*
- * FIXES_gscDetermineOrder[]
- *
- * Name of the ordering callback.
- */
- FIXES_gscDetermineOrder[] = "_FIXES_DetermineOrder",
- /*
- * FIXES_gscSetPlayerMenu[]
- *
- * Name of the remote set player menu function.
- */
- FIXES_gscSetPlayerMenu[] = "_FIXES_SetPlayerMenu",
- /*
- * FIXES_gscClearPlayerMenu[]
- *
- * Name of the remote function to clear a player's menu set.
- */
- FIXES_gscClearPlayerMenu[] = "_FIXES_ClearPlayerMenu",
- /*
- * FIXES_gscAllowTeleport[]
- *
- * Name of the remote allow teleport function.
- */
- FIXES_gscAllowTeleport[] = "_FIXES_AllowTeleport",
- /*
- * FIXES_gscPutPlayerInVehicle[]
- *
- * Name of the remote vehicle entry function.
- */
- FIXES_gscPutPlayerInVehicle[] = "_FIXES_PutPlayerInVehicle",
- /*
- * FIXES_gscAllowInteriorWeapons[]
- *
- * Name of the remote interior weapons function.
- */
- FIXES_gscAllowInteriorWeapons[] = "_FIXES_AllowInteriorWeapons",
- /*
- * FIXES_gscSetPlayerAttachedObj[]
- *
- * Name of the remote attache object function.
- */
- FIXES_gscSetPlayerAttachedObj[] = "_FIXES_SetPlayerAttachedObject",
- /*
- * FIXES_gscTogglePlayerControl[]
- *
- * Name of the remote player toggle function.
- */
- FIXES_gscTogglePlayerControl[] = "_FIXES_TogglePlayerControllable",
- /*
- * FIXES_gscSetPlayerWorldBounds[]
- *
- * Name of the remote world bounds function.
- */
- FIXES_gscSetPlayerWorldBounds[] = "_FIXES_SetPlayerWorldBounds",
- /*
- * FIXES_gscGameTextShow[]
- *
- * Name of the remote GameText show function.
- */
- FIXES_gscGameTextShow[] = "_FIXES_GameTextShow",
- /*
- * FIXES_gscReturnProperty[]
- *
- * The property for accurate returns.
- */
- FIXES_gscReturnProperty[] = "FIXES_gscReturnProperty",
- /*
- * FIXES_gscSingleProperty[]
- *
- * The property for checking this is the only running script with fixes in.
- */
- FIXES_gscSingleProperty[] = "FIXES_gscSingleProperty",
- /*
- * FIXES_gscMenuProperty[]
- *
- * The property for a player's current menu.
- */
- FIXES_gscMenuProperty[] = "FIXES_gscMenuProperty",
- /*
- * FIXES_gscFixesError[]
- *
- * Error shown when multiple scripts are detected.
- */
- FIXES_gscFixesError[] = "\7\7\7\7\7" "\n" \
- "*** fixes.inc error: Running multiple scripts compiled with \"fixes.inc\"..." "\n" \
- "*** Please compile your modes with \"#define FIXES_Single 0\" at the top, as" "\n" \
- "*** this setting is no longer the default (to improve the more common case)." ;
- /*
- * _FIXES_KEY_AIM
- * KEY_AIM
- *
- * Because the default SA:MP includes missed this one.
- */
- #define _FIXES_KEY_AIM (128)
- #if FIX_KEY_AIM
- #define KEY_AIM _FIXES_KEY_AIM
- #endif
- /*
- * _FIXES_SPECIAL_ACTION_PISSING
- * SPECIAL_ACTION_PISSING
- *
- * Because the default SA:MP includes missed this one.
- */
- #define _FIXES_SPECIAL_ACTION_PISSING (68)
- #if FIX_SPECIAL_ACTION_PISSING
- #define SPECIAL_ACTION_PISSING _FIXES_SPECIAL_ACTION_PISSING
- #endif
- /*
- * IsValidVehicle
- *
- * Because the default SA:MP includes missed this one.
- */
- #if FIX_IsValidVehicle
- native IsValidVehicle(vehicleid);
- #endif
- /*
- * GetGravity
- *
- * Because the default SA:MP includes missed this one.
- */
- #if FIX_GetGravity
- native Float:GetGravity();
- #endif
- /*
- * gpci
- *
- * Because the default SA:MP includes missed this one.
- */
- #if FIX_gpci
- native gpci(playerid, serial[], maxlen);
- #endif
- /*
- * BODYPARTS
- *
- * Because the default SA:MP includes missed these.
- */
- #if FIX_BODYPARTS
- #define BODY_PART_TORSO (3)
- #define BODY_PART_GROIN (4)
- #define BODY_PART_LEFT_ARM (5)
- #define BODY_PART_RIGHT_ARM (6)
- #define BODY_PART_LEFT_LEG (7)
- #define BODY_PART_RIGHT_LEG (8)
- #define BODY_PART_HEAD (9)
- #endif
- /*
- * CAMERAMODES
- *
- * Because the default SA:MP includes missed these.
- */
- #if FIX_CAMERAMODES
- #define CAM_MODE_DISCONNECTED (-1)
- #define CAM_MODE_NONE (0)
- #define CAM_MODE_BEHINDCAR (3)
- #define CAM_MODE_FOLLOWPED (4)
- #define CAM_MODE_SNIPER (7)
- #define CAM_MODE_ROCKETLAUNCHER (8)
- #define CAM_MODE_FIXED (15)
- #define CAM_MODE_1STPERSON (16)
- #define CAM_MODE_CAM_ON_A_STRING (18)
- #define CAM_MODE_BEHINDBOAT (22)
- #define CAM_MODE_CAMERA (46)
- #define CAM_MODE_ROCKETLAUNCHER_HS (51)
- #define CAM_MODE_AIMWEAPON (53)
- #define CAM_MODE_AIMWEAPON_FROMCAR (55)
- #define CAM_MODE_DW_HELI_CHASE (56)
- #endif
- /*
- * IS_FILTERSCRIPT
- *
- * "FILTERSCRIPT" can't always be relied on to be set. This is not a pre-
- * processor macro, but may be better than nothing (also used internally).
- */
- #if FIX_FILTERSCRIPT
- #define IS_FILTERSCRIPT _FIXES_gIsFilterscript
- #endif
- /*
- * FIXES_DetermineOrder()
- *
- * Figure out which script is called first by callbacks.
- */
- #if !FIXES_Single
- forward _FIXES_DetermineOrder();
-
- static FIXES_DetermineOrder()
- {
- deleteproperty(5, FIXES_gscOrderProperty),
- // Called in the Game Mode first (thus needs correcting).
- setproperty(5, FIXES_gscNoGMProperty, 1),
- CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@),
- deleteproperty(5, FIXES_gscNoGMProperty),
- CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@);
- }
- #endif
- /*
- * FIXES_IsPlayerConnected(playerid)
- *
- * FIXES:
- * IsPlayerConnected
- */
- #if defined _ALS_IsPlayerConnected
- #error _ALS_IsPlayerConnected defined
- #endif
- native BAD_IsPlayerConnected(playerid) = IsPlayerConnected;
- #if FIX_IsPlayerConnected
- stock FIXES_IsPlayerConnected(playerid)
- {
- return _FIXES_IS_PLAYER_CONNECTED(playerid);
- }
-
- #define _ALS_IsPlayerConnected
- #define IsPlayerConnected FIXES_IsPlayerConnected
- #endif
- /*
- * _FIXES_CreateGameTextDraws(playerid, test)
- *
- * Create the text draws used to replicate game texts.
- *
- * FIXES:
- * GameText
- */
- #if FIX_GameText
- static _FIXES_CreateGameTextDraws(const playerid)
- {
- if (playerid == INVALID_PLAYER_ID)
- {
- new
- Text:t;
-
- #if FIX_GameTextStyles
-
- // Global style 7 (vehicle name).
- t = FIXES_gsGTStyle[7] = TextDrawCreate(608.000000, 344.000000, FIXES_gscSpace),
- TextDrawLetterSize(t, 1.000000, 3.000000),
- TextDrawAlignment(t, 3),
- TextDrawColor(t, 0x36682CFF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 2),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 2),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 10.0, 200.0);
-
- // Global style 8 (location name).
- t = FIXES_gsGTStyle[8] = TextDrawCreate(608.000000, 386.500000, FIXES_gscSpace),
- TextDrawLetterSize(t, 1.200000, 3.799998),
- TextDrawAlignment(t, 3),
- TextDrawColor(t, 0xACCBF1FF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 2),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 0),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 10.0, 200.0);
-
- // Global style 9 (radio name).
- t = FIXES_gsGTStyle[9] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace),
- TextDrawLetterSize(t, 0.600000, 1.899999),
- TextDrawAlignment(t, 2),
- TextDrawColor(t, 0x906210FF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 1),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 2),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 200.0, 620.0);
-
- // Global style 10 (radio switch).
- t = FIXES_gsGTStyle[10] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace),
- TextDrawLetterSize(t, 0.600000, 1.899999),
- TextDrawAlignment(t, 2),
- TextDrawColor(t, 0x969696FF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 1),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 2),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 200.0, 620.0);
-
- // Global style 11 (positive money).
- t = FIXES_gsGTStyle[11] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace),
- TextDrawLetterSize(t, 0.550000, 2.150000),
- TextDrawAlignment(t, 3),
- TextDrawColor(t, 0x36682CFF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 2),
- TextDrawBackgroundColor(t, 0x000000FF),
- TextDrawFont(t, 3),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 10.0, 200.0);
-
- // Global style 12 (negative money).
- t = FIXES_gsGTStyle[12] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace),
- TextDrawLetterSize(t, 0.550000, 2.150000),
- TextDrawAlignment(t, 3),
- TextDrawColor(t, 0xB4191DFF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 2),
- TextDrawBackgroundColor(t, 0x000000FF),
- TextDrawFont(t, 3),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 10.0, 200.0);
-
- // Global style 13 (stunt).
- t = FIXES_gsGTStyle[13] = TextDrawCreate(380.000000, 341.000000, FIXES_gscSpace),
- TextDrawLetterSize(t, 0.579999, 2.400000),
- TextDrawTextSize(t, 40.000000, 460.000000),
- TextDrawAlignment(t, 2),
- TextDrawColor(t, 0xD7D3CCFF),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0),
- TextDrawSetShadow(t, 2),
- TextDrawSetOutline(t, 0),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 1),
- TextDrawSetProportional(t, 1),
-
- #endif
-
- // Global style 0.
- t = FIXES_gsGTStyle[0] = TextDrawCreate(320.0, 214.0, FIXES_gscSpace),
- TextDrawLetterSize(t, 1.3, 3.6),
- TextDrawAlignment(t, 2),
- TextDrawColor(t, 0x906210FF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 2),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 3),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 200.0, 620.0);
-
- // Global style 1.
- t = FIXES_gsGTStyle[1] = TextDrawCreate(620.0, 310.0, FIXES_gscSpace),
- TextDrawLetterSize(t, 1.0, 2.6),
- TextDrawAlignment(t, 3),
- TextDrawColor(t, 0x906210FF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 2),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 3),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 10.0, 200.0);
-
- // Global style 2.
- t = FIXES_gsGTStyle[2] = TextDrawCreate(320.0, 156.0, FIXES_gscSpace),
- TextDrawLetterSize(t, 2.1, 4.2),
- TextDrawAlignment(t, 2),
- TextDrawColor(t, 0xE1E1E1FF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 3),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 0),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 200.0, 620.0);
-
- // Global style 3.
- t = FIXES_gsGTStyle[3] = TextDrawCreate(320.000000, 154.500000, FIXES_gscSpace),
- TextDrawLetterSize(t, 0.600000, 2.750000),
- TextDrawAlignment(t, 2),
- TextDrawColor(t, 0x906210FF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 2),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 2),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 200.0, 620.0);
-
- // Global style 4.
- t = FIXES_gsGTStyle[4] = TextDrawCreate(320.000000, 115.500000, FIXES_gscSpace),
- TextDrawLetterSize(t, 0.600000, 2.750000),
- TextDrawAlignment(t, 2),
- TextDrawColor(t, 0x906210FF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 2),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 2),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 200.0, 620.0);
-
- // Global style 5.
- t = FIXES_gsGTStyle[5] = TextDrawCreate(320.0, 217.0, FIXES_gscSpace),
- TextDrawLetterSize(t, 0.6, 2.75),
- TextDrawAlignment(t, 2),
- TextDrawColor(t, 0xE1E1E1FF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 2),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 2),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 200.0, 620.0);
-
- // Global style 6.
- t = FIXES_gsGTStyle[6] = TextDrawCreate(320.000000, 60.000000, FIXES_gscSpace),
- TextDrawLetterSize(t, 1.000000, 3.599998),
- TextDrawAlignment(t, 2),
- TextDrawColor(t, 0xACCBF1FF),
- TextDrawSetShadow(t, 0),
- TextDrawSetOutline(t, 2),
- TextDrawBackgroundColor(t, 0x000000AA),
- TextDrawFont(t, 3),
- TextDrawSetProportional(t, 1),
- TextDrawUseBox(t, true),
- TextDrawBoxColor(t, 0x00000000),
- TextDrawTextSize(t, 200.0, 620.0);
- }
- else
- {
- new
- PlayerText:t;
-
- #if FIX_GameTextStyles
-
- // Global style 7 (playerid, vehicle name).
- t = FIXES_gsPGTStyle[playerid][7] = CreatePlayerTextDraw(playerid, 608.000000, 344.000000, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 1.000000, 3.000000),
- PlayerTextDrawAlignment(playerid, t, 3),
- PlayerTextDrawColor(playerid, t, 0x36682CFF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 2),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
- PlayerTextDrawFont(playerid, t, 2),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
-
- // Global style 8 (playerid, location name).
- t = FIXES_gsPGTStyle[playerid][8] = CreatePlayerTextDraw(playerid, 608.000000, 386.500000, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 1.200000, 3.799998),
- PlayerTextDrawAlignment(playerid, t, 3),
- PlayerTextDrawColor(playerid, t, 0xACCBF1FF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 2),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
- PlayerTextDrawFont(playerid, t, 0),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
-
- // Global style 9 (playerid, radio name).
- t = FIXES_gsPGTStyle[playerid][9] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999),
- PlayerTextDrawAlignment(playerid, t, 2),
- PlayerTextDrawColor(playerid, t, 0x906210FF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 1),
- PlayerTextDrawBackgroundColor(playerid, t, 170),
- PlayerTextDrawFont(playerid, t, 2),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
-
- // Global style 10 (playerid, radio switch).
- t = FIXES_gsPGTStyle[playerid][10] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999),
- PlayerTextDrawAlignment(playerid, t, 2),
- PlayerTextDrawColor(playerid, t, 0x969696FF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 1),
- PlayerTextDrawBackgroundColor(playerid, t, 170),
- PlayerTextDrawFont(playerid, t, 2),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
-
- // Global style 11 (playerid, positive money).
- t = FIXES_gsPGTStyle[playerid][11] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000),
- PlayerTextDrawAlignment(playerid, t, 3),
- PlayerTextDrawColor(playerid, t, 0x36682CFF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 2),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000FF),
- PlayerTextDrawFont(playerid, t, 3),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
-
- // Global style 12 (playerid, negative money).
- t = FIXES_gsPGTStyle[playerid][12] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000),
- PlayerTextDrawAlignment(playerid, t, 3),
- PlayerTextDrawColor(playerid, t, 0xB4191DFF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 2),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000FF),
- PlayerTextDrawFont(playerid, t, 3),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
-
- // Global style 13 (playerid, stunt).
- t = FIXES_gsPGTStyle[playerid][13] = CreatePlayerTextDraw(playerid, 380.000000, 341.000000, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 0.579999, 2.400000),
- PlayerTextDrawTextSize(playerid, t, 40.000000, 460.000000),
- PlayerTextDrawAlignment(playerid, t, 2),
- PlayerTextDrawColor(playerid, t, 0xD7D3CCFF),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0),
- PlayerTextDrawSetShadow(playerid, t, 2),
- PlayerTextDrawSetOutline(playerid, t, 0),
- PlayerTextDrawBackgroundColor(playerid, t, 170),
- PlayerTextDrawFont(playerid, t, 1),
- PlayerTextDrawSetProportional(playerid, t, 1);
-
- #endif
-
- // Global style 0.
- t = FIXES_gsPGTStyle[playerid][0] = CreatePlayerTextDraw(playerid, 320.0, 214.0, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 1.3, 3.6),
- PlayerTextDrawAlignment(playerid, t, 2),
- PlayerTextDrawColor(playerid, t, 0x906210FF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 2),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
- PlayerTextDrawFont(playerid, t, 3),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
-
- // Global style 1.
- t = FIXES_gsPGTStyle[playerid][1] = CreatePlayerTextDraw(playerid, 620.0, 310.0, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 1.0, 2.6),
- PlayerTextDrawAlignment(playerid, t, 3),
- PlayerTextDrawColor(playerid, t, 0x906210FF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 2),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
- PlayerTextDrawFont(playerid, t, 3),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
-
- // Global style 2.
- t = FIXES_gsPGTStyle[playerid][2] = CreatePlayerTextDraw(playerid, 320.0, 156.0, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 2.1, 4.2),
- PlayerTextDrawAlignment(playerid, t, 2),
- PlayerTextDrawColor(playerid, t, 0xE1E1E1FF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 3),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
- PlayerTextDrawFont(playerid, t, 0),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
-
- // Global style 3.
- t = FIXES_gsPGTStyle[playerid][3] = CreatePlayerTextDraw(playerid, 320.000000, 154.500000, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000),
- PlayerTextDrawAlignment(playerid, t, 2),
- PlayerTextDrawColor(playerid, t, 0x906210FF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 2),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
- PlayerTextDrawFont(playerid, t, 2),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
-
- // Global style 4.
- t = FIXES_gsPGTStyle[playerid][4] = CreatePlayerTextDraw(playerid, 320.000000, 115.500000, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000),
- PlayerTextDrawAlignment(playerid, t, 2),
- PlayerTextDrawColor(playerid, t, 0x906210FF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 2),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
- PlayerTextDrawFont(playerid, t, 2),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
-
- // Global style 5.
- t = FIXES_gsPGTStyle[playerid][5] = CreatePlayerTextDraw(playerid, 320.0, 217.0, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 0.6, 2.75),
- PlayerTextDrawAlignment(playerid, t, 2),
- PlayerTextDrawColor(playerid, t, 0xE1E1E1FF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 2),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
- PlayerTextDrawFont(playerid, t, 2),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
-
- // Global style 6.
- t = FIXES_gsPGTStyle[playerid][6] = CreatePlayerTextDraw(playerid, 320.000000, 60.000000, FIXES_gscSpace),
- PlayerTextDrawLetterSize(playerid, t, 1.000000, 3.599998),
- PlayerTextDrawAlignment(playerid, t, 2),
- PlayerTextDrawColor(playerid, t, 0xACCBF1FF),
- PlayerTextDrawSetShadow(playerid, t, 0),
- PlayerTextDrawSetOutline(playerid, t, 2),
- PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
- PlayerTextDrawFont(playerid, t, 3),
- PlayerTextDrawSetProportional(playerid, t, 1),
- PlayerTextDrawUseBox(playerid, t, true),
- PlayerTextDrawBoxColor(playerid, t, 0x00000000),
- PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
- }
- }
- #endif
- /*
- * OnFilterScriptInit()
- *
- * Set "IS_FILTERSCRIPT" to true as this callback is ONLY called if this script
- * is actually a FilterScript. Then call "FIXES_OnScriptInit".
- *
- * FIXES:
- * IS_FILTERSCRIPT
- * OnPlayerConnect
- * GameText
- */
- public OnFilterScriptInit()
- {
- // It is possible for this to be the only thing done in this function!
- _FIXES_gIsFilterscript = true;
-
- state _ALS : _ALS_go;
-
- #if FIXES_Single
- // Check this really IS the only script running.
- if (existproperty(5, FIXES_gscSingleProperty))
- {
- print(FIXES_gscFixesError);
- }
- else
- {
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_SECOND_USE,
- setproperty(5, FIXES_gscSingleProperty, 1);
- }
- #endif
-
- // =================
- // BEGIN: GameText
- // =================
- #if FIX_GameText
- for (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i)
- {
- FIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS;
- }
- #endif
- #if FIXES_Single
- #if FIX_GameText
- _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
- #endif
- // =================
- // END: GameText
- // =================
- #else
- FIXES_DetermineOrder(),
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;
- #endif
-
- #if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect
- FIXES_gsSettings |= e_FIXES_SETTINGS_NO_GAME_TEXT;
- #endif
- // These are all the fixes that use "_FIXES_FOREACH".
- #if FIX_OnPlayerConnect || _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
- for (new playerid = 0; playerid != MAX_PLAYERS; ++playerid)
- {
- if (BAD_IsPlayerConnected(playerid))
- {
- // No "defined" checks - if you don't want this fix because
- // you don't have an "OnPlayerConnect", just don't use it!
- // Of course, it helps that the copy of "OnPlayerConnect"
- // in this include is almost always called!
- #if FIX_OnPlayerConnect
- // ========================
- // BEGIN: OnPlayerConnect
- // ========================
- OnPlayerConnect(playerid);
- // ========================
- // END: OnPlayerConnect
- // ========================
- #else
- _FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
-
- #if FIX_GameText
- // =================
- // BEGIN: GameText
- // =================
- _FIXES_IS_IN_CHARGE()
- {
- _FIXES_CreateGameTextDraws(playerid);
- }
- // =================
- // END: GameText
- // =================
- #endif
- #endif
- }
- }
- #endif
- #if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_NO_GAME_TEXT;
- #endif
-
- return FIXES_OnFilterScriptInit();
- }
- #if defined _ALS_OnFilterScriptInit
- #error _ALS_OnFilterScriptInit defined
- #endif
- #define _ALS_OnFilterScriptInit
- #define OnFilterScriptInit(%0) FIXES_OnFilterScriptInit(%0) <_ALS : _ALS_go>
- _FIXES_FORWARD FIXES_OnFilterScriptInit();
- /*
- * OnGameModeInit()
- *
- * Call "FIXES_OnScriptInit" if this is not a FilterScript.
- *
- * FIXES:
- * IS_FILTERSCRIPT
- * AllowInteriorWeapons
- * AllowTeleport
- */
- public OnGameModeInit()
- {
- state _ALS : _ALS_go;
-
- #if FIXES_Single
- // Check this really IS the only script running. Properties reset when
- // a gamemode restarts, so we don't have to worry about filterscipts
- // detecting themselves.
- if (FIXES_gsSettings & e_FIXES_SETTINGS_SECOND_USE)
- {
- if (existproperty(5, FIXES_gscSingleProperty))
- {
- print(FIXES_gscFixesError);
- }
- else
- {
- setproperty(5, FIXES_gscSingleProperty, 1);
- }
- }
- else
- {
- // When the server starts, we need to allow an FS to load with a GM
- // that doesn't use fixes.inc. This is the only case where a
- // property can be set while a ganemode isn't running. This will
- // mean that the FS won't complain if they are both using fixes, but
- // the GM still will, so all is good.
- FIXES_gsSettings |= e_FIXES_SETTINGS_SECOND_USE;
- }
- #endif
-
- // =============================
- // BEGIN: AllowInteriorWeapons
- // =============================
- // ======================
- // BEGIN: AllowTeleport
- // ======================
- #if FIX_AllowInteriorWeapons && FIX_AllowTeleport && !defined FILTERSCRIPT
- FIXES_gsSettings &= ~(e_FIXES_SETTINGS_INTERIOR | e_FIXES_SETTINGS_ADMIN_TELEPORT);
- #elseif FIX_AllowInteriorWeapons
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
- #elseif FIX_AllowTeleport && !defined FILTERSCRIPT
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
- #endif
- // ======================
- // END: AllowTeleport
- // ======================
- // ===========================
- // END: AllowInteriorWeapons
- // ===========================
-
- #if FIX_GameText || !FIXES_Single
- if (!_FIXES_gIsFilterscript)
- {
- // =================
- // BEGIN: GameText
- // =================
- #if FIX_GameText
- for (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i)
- {
- FIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS;
- }
- #if FIXES_Single
- _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
- #endif
- #endif
- // =================
- // END: GameText
- // =================
- #if !FIXES_Single
- FIXES_DetermineOrder();
- #endif
- }
- #endif
- #if !FIXES_Single
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;
- #endif
-
- return FIXES_OnGameModeInit();
- }
- #if defined _ALS_OnGameModeInit
- #error _ALS_OnGameModeInit defined
- #endif
- #define _ALS_OnGameModeInit
- #define OnGameModeInit(%0) FIXES_OnGameModeInit(%0) <_ALS : _ALS_go>
- _FIXES_FORWARD FIXES_OnGameModeInit();
- /*
- * OnGameModeExit()
- *
- * Fast way of detecting not to retain any data.
- */
- #if !FIXES_Single || FIX_PlayerDialogResponse
- public OnGameModeExit()
- {
- #if !FIXES_Single
- FIXES_gsSettings |= e_FIXES_SETTINGS_DROP_ALL_DATA;
- if (!_FIXES_gIsFilterscript && FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
- {
- FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING,
- FIXES_DetermineOrder();
- }
- #endif
-
- // =============================
- // BEGIN: PlayerDialogResponse
- // =============================
- #if FIX_PlayerDialogResponse
- for (new playerid = 0; playerid != MAX_PLAYERS; ++playerid)
- {
- ShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace);
- }
- #endif
- // =============================
- // END: PlayerDialogResponse
- // =============================
-
- return FIXES_OnGameModeExit();
- }
-
- #if defined _ALS_OnGameModeExit
- #error _ALS_OnGameModeExit defined
- #endif
- #define _ALS_OnGameModeExit
- #define OnGameModeExit(%0) FIXES_OnGameModeExit(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnGameModeExit();
- #endif
- /*
- * OnFilterScriptExit()
- *
- * Fast way of detecting not to retain any data.
- */
- #if !FIXES_Single || FIX_GameText || FIX_OnPlayerDisconnect
- public OnFilterScriptExit()
- {
- #if FIX_OnPlayerDisconnect
- // Removal safe loop.
- for (new next, playerid = FIXES_gsPlayersIterator[MAX_PLAYERS]; playerid != MAX_PLAYERS; playerid = next)
- {
- next = FIXES_gsPlayersIterator[playerid],
- OnPlayerDisconnect(playerid, 4);
- #if FIXES_Single
- // =================
- // BEGIN: GameText
- // =================
- #if FIX_GameText
- #if FIX_GameTextStyles
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
- #endif
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
- #endif
- #endif
- }
- #endif
- #if FIXES_Single
- // =================
- // BEGIN: GameText
- // =================
- #if FIX_GameText
- #if defined FIXES_OnFilterScriptExit
- FIXES_OnFilterScriptExit();
- #endif
- #if !FIX_OnPlayerDisconnect
- _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
- {
- #if FIX_GameTextStyles
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
- #endif
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
- }
- #endif
- return
- #if FIX_GameTextStyles
- TextDrawDestroy(FIXES_gsGTStyle[13]),
- TextDrawDestroy(FIXES_gsGTStyle[12]),
- TextDrawDestroy(FIXES_gsGTStyle[11]),
- TextDrawDestroy(FIXES_gsGTStyle[10]),
- TextDrawDestroy(FIXES_gsGTStyle[9]),
- TextDrawDestroy(FIXES_gsGTStyle[8]),
- TextDrawDestroy(FIXES_gsGTStyle[7]),
- #endif
- TextDrawDestroy(FIXES_gsGTStyle[6]),
- TextDrawDestroy(FIXES_gsGTStyle[5]),
- TextDrawDestroy(FIXES_gsGTStyle[4]),
- TextDrawDestroy(FIXES_gsGTStyle[3]),
- TextDrawDestroy(FIXES_gsGTStyle[2]),
- TextDrawDestroy(FIXES_gsGTStyle[1]),
- TextDrawDestroy(FIXES_gsGTStyle[0]);
- #else
- return FIXES_OnFilterScriptExit();
- #endif
- // =================
- // END: GameText
- // =================
- #else
- if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
- {
- FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING,
- FIXES_DetermineOrder();
- }
- return FIXES_OnFilterScriptExit();
- #endif
- }
-
- #if defined _ALS_OnFilterScriptExit
- #error _ALS_OnFilterScriptExit defined
- #endif
- #define _ALS_OnFilterScriptExit
- #define OnFilterScriptExit(%0) FIXES_OnFilterScriptExit(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnFilterScriptExit();
- #endif
- /*
- * OnPlayerCommandText(playerid, cmdtext[])
- *
- * FIXES:
- * OnPlayerCommandText
- */
- #if FIX_OnPlayerCommandText
- public OnPlayerCommandText(playerid, cmdtext[])
- {
- // ============================
- // BEGIN: OnPlayerCommandText
- // ============================
- #if FIX_OnPlayerCommandText
- // If this "#if" is around the whole function, it doesn't always
- // compile properly.
- return FIXES_OnPlayerCommandText(playerid, (cmdtext[0] <= '\1') ? FIXES_gscNULL : cmdtext);
- #endif
- // ============================
- // END: OnPlayerCommandText
- // ============================
- }
-
- #if defined _ALS_OnPlayerCommandText
- #error _ALS_OnPlayerCommandText defined
- #endif
- #define _ALS_OnPlayerCommandText
- #define OnPlayerCommandText(%0) FIXES_OnPlayerCommandText(%0) <_ALS : _ALS_go>
-
- forward FIXES_OnPlayerCommandText(playerid, cmdtext[]);
- public FIXES_OnPlayerCommandText(playerid, cmdtext[]) <_ALS : _ALS_x0, _ALS : _ALS_x1> { return 0; }
- public FIXES_OnPlayerCommandText(playerid, cmdtext[]) <> { return 0; }
- #endif
- /*
- * OnPlayerConnect(playerid)
- *
- * Almost every fix uses this callback for initialisation. It is only
- * explicitly referenced for those fixes where this is all the code. The
- * inclusion code was approaching the 512 line length limit, so I shrank it.
- *
- * FIXES:
- * TogglePlayerControllable
- * SetPlayerWorldBounds
- * GetPlayerColor
- * SetPlayerName
- * GetPlayerSkin
- * IsPlayerInCheckpoint
- * IsPlayerInRaceCheckpoint
- * GetPlayerWeapon
- * PutPlayerInVehicle
- * OnPlayerEnterVehicle
- * AllowTeleport
- * OnDialogResponse
- * SetSpawnInfo
- * AllowInteriorWeapons
- * TrainExit
- * Kick
- * OnPlayerEnterVehicle_2
- * PlayerDialogResponse
- * OnPlayerSpawn
- * ApplyAnimation_2
- */
- #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_SetPlayerName || FIX_GetPlayerColour
- #define _FIXES_ON_PLAYER_CONNECT
- #elseif FIX_GetPlayerSkin || FIX_IsPlayerInCheckpoint || FIX_IsPlayerInRaceCheckpoint || FIX_GetPlayerWeapon
- #define _FIXES_ON_PLAYER_CONNECT
- #elseif FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_OnDialogResponse
- #define _FIXES_ON_PLAYER_CONNECT
- #elseif FIX_GetPlayerDialog || FIX_SetSpawnInfo || FIX_AllowInteriorWeapons || FIX_TrainExit
- #define _FIXES_ON_PLAYER_CONNECT
- #elseif FIX_Kick || FIX_OnPlayerEnterVehicle_2 || FIX_PlayerDialogResponse || FIX_GetPlayerInterior
- #define _FIXES_ON_PLAYER_CONNECT
- #elseif FIX_OnPlayerSpawn || FIX_ApplyAnimation_2 || FIX_GameText || _FIX_Menus
- #define _FIXES_ON_PLAYER_CONNECT
- #elseif FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_OnPlayerConnect || FIX_SetPlayerTime
- #define _FIXES_ON_PLAYER_CONNECT
- #endif
- #if defined _FIXES_ON_PLAYER_CONNECT
- public OnPlayerConnect(playerid)
- {
- // =========================
- // BEGIN: ApplyAnimation_2
- // =========================
- #if FIX_ApplyAnimation_2
- FIXES_gsPlayerAnimLibs[playerid][0] =
- FIXES_gsPlayerAnimLibs[playerid][1] =
- FIXES_gsPlayerAnimLibs[playerid][2] =
- FIXES_gsPlayerAnimLibs[playerid][3] =
- FIXES_gsPlayerAnimLibs[playerid][4] = -1;
- #endif
- // =======================
- // END: ApplyAnimation_2
- // =======================
-
- #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
- _FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
- #endif
-
- FIXES_PRINTF("FIXES_OnPlayerConnect: %d", playerid);
- // This is only reset when the Game Mode changes or when a new
- #if FIX_Kick || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_AllowInteriorWeapons || FIX_TrainExit || FIX_OnPlayerEnterVehicle_2
- // player connects, which is what we want. The other items are the
- // same, but must be done only once. This variable will tend to
- // hold data relevant only in the master script (the first
- // filterscript).
- #if FIX_Kick || FIX_SetPlayerTime
- FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_ON_PLAYER_CONNECT;
- #else
- FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_NONE;
- #endif
- #endif
-
- // =================
- // BEGIN: GameText
- // =================
- #if FIX_GameText
- #if !FIXES_Single
- if (FIXES_gsSettings & (e_FIXES_SETTINGS_NO_GAME_TEXT | e_FIXES_SETTINGS_IN_CHARGE) == e_FIXES_SETTINGS_IN_CHARGE)
- #endif
- {
- _FIXES_CreateGameTextDraws(playerid);
- }
- #endif
- // =================
- // END: GameText
- // =================
-
- #if !FIXES_Single
- if (!GetPVarInt(playerid, FIXES_pvarNotNewPlayer))
- #endif
- {
- FIXES_PRINTF("FIXES_OnPlayerConnect: First (%d)", FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE);
- // ======================
- // BEGIN: SetPlayerName
- // ======================
- #if FIX_SetPlayerName
- new
- name[MAX_PLAYER_NAME];
- GetPlayerName(playerid, name, MAX_PLAYER_NAME);
- if (strcmp(name, FIXES_gscTempName) == 0)
- {
- Kick(playerid);
- }
- #endif
- // ======================
- // END: SetPlayerName
- // ======================
-
- // =============================
- // BEGIN: SetPlayerWorldBounds
- // =============================
- #if FIX_SetPlayerWorldBounds && !FIXES_Single
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] =
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] =
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] =
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] =
- 0.0;
- #endif
- // =============================
- // END: SetPlayerWorldBounds
- // =============================
-
- // =======================
- // BEGIN: SetPlayerColor
- // =======================
- #if FIX_GetPlayerColour
- SetPlayerColor(playerid, FIXES_gscPlayerColours[playerid % 100]);
- #endif
- // =======================
- // END: SetPlayerColor
- // =======================
-
- // ======================
- // BEGIN: GetPlayerSkin
- // ======================
- #if FIX_GetPlayerSkin
- #if FIXES_Single
- FIXES_gsPlayerSkin[playerid] = 0;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerSkin, 0);
- #endif
- #endif
- // ======================
- // END: GetPlayerSkin
- // ======================
-
- // =============================
- // BEGIN: IsPlayerInCheckpoint
- // =============================
- #if FIX_IsPlayerInCheckpoint
- DisablePlayerCheckpoint(playerid);
- #endif
- // =============================
- // END: IsPlayerInCheckpoint
- // =============================
-
- // =================================
- // BEGIN: IsPlayerInRaceCheckpoint
- // =================================
- #if FIX_IsPlayerInRaceCheckpoint
- DisablePlayerRaceCheckpoint(playerid);
- #endif
- // =================================
- // END: IsPlayerInRaceCheckpoint
- // =================================
-
- // ========================
- // BEGIN: GetPlayerWeapon
- // ========================
- #if FIX_GetPlayerWeapon
- #if FIXES_Single
- FIXES_gsPlayerWeapon[playerid] = -1;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);
- #endif
- #endif
- // ========================
- // END: GetPlayerWeapon
- // ========================
-
- // ==========================
- // BEGIN: GetPlayerInterior
- // ==========================
- #if FIX_GetPlayerInterior
- #if FIXES_Single
- FIXES_gsInterior[playerid] = 0;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerInterior, 0);
- #endif
- #endif
- // ==========================
- // END: GetPlayerInterior
- // ==========================
-
- // =========================
- // BEGIN: OnDialogResponse
- // =========================
- #if FIX_OnDialogResponse || FIX_GetPlayerDialog
- #if FIXES_Single
- FIXES_gsDialogID[playerid] = INVALID_DIALOG_ID;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
- #endif
- #endif
- // =========================
- // END: OnDialogResponse
- // =========================
-
- // =============================
- // BEGIN: PlayerDialogResponse
- // =============================
- #if FIX_PlayerDialogResponse
- ShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace);
- #endif
- // =============================
- // END: PlayerDialogResponse
- // =============================
-
- // =====================
- // BEGIN: SetSpawnInfo
- // =====================
- #if FIX_SetSpawnInfo
- SetSpawnInfo(playerid, NO_TEAM, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
- #endif
- // =====================
- // END: SetSpawnInfo
- // =====================
-
- // ======================
- // BEGIN: OnPlayerSpawn
- // ======================
- #if FIX_OnPlayerSpawn
- #if FIXES_Single
- FIXES_gsLastCash[playerid] = 0;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0);
- #endif
- #endif
- // ======================
- // END: OnPlayerSpawn
- // ======================
-
- #if !FIXES_Single
- // No longer their first time.
- SetPVarInt(playerid, FIXES_pvarNotNewPlayer, 1);
- #endif
- }
- // =============
- // BEGIN: Kick
- // =============
- #if FIX_Kick || FIX_SetPlayerTime
- new
- ret = FIXES_OnPlayerConnect(playerid);
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_ON_PLAYER_CONNECT;
- return ret;
- #else
- return FIXES_OnPlayerConnect(playerid);
- #endif
- // =============
- // END: Kick
- // =============
- }
-
- #if defined _ALS_OnPlayerConnect
- #error _ALS_OnPlayerConnect defined
- #endif
- #define _ALS_OnPlayerConnect
- #define OnPlayerConnect(%0) FIXES_OnPlayerConnect(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerConnect(playerid);
- #endif
- /*
- * OnPlayerDisonnect(playerid, reason)
- *
- * FIXES:
- * SetPlayerAttachedObject
- * IsPlayerAttachedObjectSlotUsed
- * Kick
- * GetPlayerMenu
- */
- #if FIX_SetPlayerAttachedObject || FIX_IsPlayerAttachedObjSlotUsed || FIX_Kick || (FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2)) || FIX_GetPlayerMenu || _FIX_Menus || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_ApplyAnimation_2
- public OnPlayerDisconnect(playerid, reason)
- {
- new
- ret = FIXES_OnPlayerDisconnect(playerid, reason);
-
- // =========================
- // BEGIN: ApplyAnimation_2
- // =========================
- #if FIX_ApplyAnimation_2
- if (FIXES_gsAnimTimer[playerid])
- {
- KillTimer(FIXES_gsAnimTimer[playerid]),
- FIXES_gsAnimTimer[playerid] = 0;
- }
- #endif
- // =======================
- // END: ApplyAnimation_2
- // =======================
-
- // ======================
- // BEGIN: GetPlayerMenu
- // ======================
- #if FIX_GetPlayerMenu
- FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
- #endif
- // ======================
- // END: GetPlayerMenu
- // ======================
-
- // ==========================
- // BEGIN: FIXES_SilentKick
- // ==========================
- #if FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2)
- new
- shift = FIXES_gsPlayerIP[playerid];
- if (shift != -1)
- {
- // Unban the IP (timed out).
- new
- ip[16];
- format(ip, sizeof (ip), "unbanip %d.%d.%d.%d", shift >>> 24, (shift >>> 16) & 0xFF, (shift >>> 8) & 0xFF, shift & 0xFF),
- FIXES_gsPlayerIP[playerid] = -1;
- }
- #endif
- // ==========================
- // END: FIXES_SilentKick
- // ==========================
-
- // ================================
- // BEGIN: SetPlayerAttachedObject
- // ================================
- #if FIX_SetPlayerAttachedObject
- #if !(FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2))
- new
- #endif
- shift = playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS;
- #pragma tabsize 4
- new
- slot = playerid / _FIXES_ATTACHMENTS;
- #if !FIXES_Single
- if (!_FIXES_gIsFilterscript)
- #endif
- {
- for (new i = 0; i != MAX_PLAYER_ATTACHED_OBJECTS; ++i)
- {
- if (FIXES_gsObjectSlots[slot] & 1 << shift + i)
- {
- RemovePlayerAttachedObject(playerid, i);
- }
- }
- }
- #pragma tabsize 4
- FIXES_gsObjectSlots[slot] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << shift);
- #endif
- // ================================
- // END: SetPlayerAttachedObject
- // ================================
-
- // =======================================
- // BEGIN: IsPlayerAttachedObjectSlotUsed
- // =======================================
- #if FIX_IsPlayerAttachedObjSlotUsed && !FIX_SetPlayerAttachedObject
- FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS);
- #endif
- // =======================================
- // END: IsPlayerAttachedObjectSlotUsed
- // =======================================
-
- // =============
- // BEGIN: Kick
- // =============
- #if FIX_Kick
- if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_KICKED)
- {
- // Stop the timer if it is still running.
- KillTimer(GetPVarInt(playerid, FIXES_pvarKick));
- }
- #endif
- // =============
- // END: Kick
- // =============
-
- #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
- _FIXES_RemoveInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
- #endif
-
- return ret;
- }
-
- #if defined _ALS_OnPlayerDisconnect
- #error _ALS_OnPlayerDisconnect defined
- #endif
- #define _ALS_OnPlayerDisconnect
- #define OnPlayerDisconnect(%0) FIXES_OnPlayerDisconnect(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerDisconnect(playerid, reason);
- #endif
- /*
- * OnPlayerDeath(playerid, killerid, reason)
- *
- * FIXES:
- * OnPlayerDeath
- * OnPlayerSpawn
- */
- #if FIX_OnPlayerDeath || FIX_OnPlayerSpawn
- public OnPlayerDeath(playerid, killerid, reason)
- {
- _FIXES_IS_IN_CHARGE()
- {
- // ======================
- // BEGIN: OnPlayerDeath
- // ======================
- #if FIX_OnPlayerDeath
- static
- sAnimlib[32],
- sAnimname[32];
- GetAnimationName(FIXES_gsLastAnimation[playerid], sAnimlib, sizeof (sAnimlib), sAnimname, sizeof (sAnimname));
- if (strcmp(sAnimlib, "PED", true))
- {
- ClearAnimations(playerid);
- }
- #endif
- // ======================
- // END: OnPlayerDeath
- // ======================
- }
-
- // ======================
- // BEGIN: OnPlayerSpawn
- // ======================
- #if FIX_OnPlayerSpawn
- new
- ret = FIXES_OnPlayerDeath(playerid, killerid, reason);
-
- #if FIXES_Single
- FIXES_gsLastCash[playerid] = GetPlayerMoney(playerid);
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerLastCash, GetPlayerMoney(playerid));
- #endif
-
- return ret;
- #else
- return FIXES_OnPlayerDeath(playerid, killerid, reason);
- #endif
- // ======================
- // END: OnPlayerSpawn
- // ======================
- }
-
- #if defined _ALS_OnPlayerDeath
- #error _ALS_OnPlayerDeath defined
- #endif
- #define _ALS_OnPlayerDeath
- #define OnPlayerDeath(%0) FIXES_OnPlayerDeath(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerDeath(playerid, killerid, reason);
- #endif
- /*
- * FIXES_SpawnPlayer(playerid)
- *
- * FIXES:
- * SpawnPlayer
- */
- #if defined _ALS_SpawnPlayer
- #error _ALS_SpawnPlayer defined
- #endif
- native BAD_SpawnPlayer(playerid) = SpawnPlayer;
- #if FIX_SpawnPlayer
- stock FIXES_SpawnPlayer(playerid)
- {
- // Valid "playerid" check inside "GetPlayerVehicleID".
- new
- vid = GetPlayerVehicleID(playerid);
- if (vid)
- {
- new
- Float:x,
- Float:y,
- Float:z;
- // Remove them without the animation.
- GetVehiclePos(vid, x, y, z),
- SetPlayerPos(playerid, x, y, z);
- }
- return SpawnPlayer(playerid);
- }
-
- #define _ALS_SpawnPlayer
- #define SpawnPlayer FIXES_SpawnPlayer
- #endif
- /*
- * FIXES_SetPlayerName(playerid, name[])
- *
- * FIXES:
- * SetPlayerName
- */
- #if defined _ALS_SetPlayerName
- #error _ALS_SetPlayerName defined
- #endif
- native BAD_SetPlayerName(playerid, const name[]) = SetPlayerName;
- #if FIX_SetPlayerName
- stock FIXES_SetPlayerName(playerid, name[])
- {
- static
- sOldName[MAX_PLAYER_NAME];
- GetPlayerName(playerid, sOldName, sizeof (sOldName));
- if (!strcmp(name, sOldName, true))
- {
- if(strcmp(name, sOldName, false))
- {
- SetPlayerName(playerid, FIXES_gscTempName);
- if(SetPlayerName(playerid, name) == -1)
- {
- SetPlayerName(playerid, sOldName);
- return -1;
- }
- return 1;
- }
- else
- {
- return 0;
- }
- }
- return SetPlayerName(playerid, name);
- }
-
- #define _ALS_SetPlayerName
- #define SetPlayerName FIXES_SetPlayerName
- #endif
- /*
- * OnPlayerRequestClass(playerid, classid)
- *
- * FIXES:
- * OnPlayerRequestClass
- */
- #if FIX_OnPlayerRequestClass
- public OnPlayerRequestClass(playerid, classid)
- {
- // =============================
- // BEGIN: OnPlayerRequestClass
- // =============================
- #if FIX_OnPlayerRequestClass
- new
- Float:x,
- Float:y,
- Float:z;
- GetPlayerPos(playerid, x, y, z),
- RemoveBuildingForPlayer(playerid, 1484, x, y, z, 10.0),
- RemoveBuildingForPlayer(playerid, 1485, x, y, z, 10.0),
- RemoveBuildingForPlayer(playerid, 1486, x, y, z, 10.0);
- #endif
- // ===========================
- // END: OnPlayerRequestClass
- // ===========================
- return FIXES_OnPlayerRequestClass(playerid, classid);
- }
-
- #if defined _ALS_OnPlayerRequestClass
- #error _ALS_OnPlayerRequestClass defined
- #endif
- #define _ALS_OnPlayerRequestClass
- #define OnPlayerRequestClass(%0) FIXES_OnPlayerRequestClass(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerRequestClass(playerid, classid);
- #endif
- /*
- * OnPlayerSpawn(playerid)
- *
- * FIXES:
- * GetPlayerSkin
- * TogglePlayerControllable
- * GetPlayerInterior
- * OnPlayerSpawn
- * GameText
- */
- #if FIX_GetPlayerSkin || FIX_TogglePlayerControllable || FIX_GetPlayerInterior || FIX_OnPlayerSpawn || FIX_GameText
- public OnPlayerSpawn(playerid)
- {
- _FIXES_IS_IN_CHARGE()
- {
- // ======================
- // BEGIN: OnPlayerSpawn
- // ======================
- #if FIX_OnPlayerSpawn
- ResetPlayerMoney(playerid);
- #if FIXES_Single
- GivePlayerMoney(playerid, FIXES_gsLastCash[playerid]);
- FIXES_gsLastCash[playerid] = 0;
- #else
- GivePlayerMoney(playerid, GetPVarInt(playerid, FIXES_pvarPlayerLastCash));
- SetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0);
- #endif
- #endif
- // ======================
- // END: OnPlayerSpawn
- // ======================
-
- // ==========================
- // BEGIN: GetPlayerInterior
- // ==========================
- #if FIX_GetPlayerInterior
- #if FIXES_Single
- FIXES_gsInterior[playerid] = 0;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerInterior, 0);
- #endif
- #endif
- // ==========================
- // END: GetPlayerInterior
- // ==========================
-
- // =================
- // BEGIN: GameText
- // =================
- #if FIX_GameText
- // Per-player GTs.
-
- #define _FIXES_PER_PLAYER_GT(%0) if (FIXES_gsPlayerPGTShown[%0][playerid] > playerid) PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][%0]), _FIXES_RemoveInternal(FIXES_gsPlayerPGTShown[%0], playerid, MAX_PLAYERS)
-
- #if FIX_GameTextStyles
- _FIXES_PER_PLAYER_GT(13);
- _FIXES_PER_PLAYER_GT(12);
- _FIXES_PER_PLAYER_GT(11);
- _FIXES_PER_PLAYER_GT(10);
- _FIXES_PER_PLAYER_GT(9);
- _FIXES_PER_PLAYER_GT(8);
- _FIXES_PER_PLAYER_GT(7);
- #endif
- _FIXES_PER_PLAYER_GT(6);
- _FIXES_PER_PLAYER_GT(5);
- _FIXES_PER_PLAYER_GT(4);
- _FIXES_PER_PLAYER_GT(3);
- _FIXES_PER_PLAYER_GT(2);
- _FIXES_PER_PLAYER_GT(1);
- _FIXES_PER_PLAYER_GT(0);
-
- #undef _FIXES_PER_PLAYER_GT
-
- // Global GTs.
- #if FIX_GameTextStyles
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[13]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[12]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[11]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[10]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[9]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[8]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[7]);
- #endif
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[6]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[5]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[4]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[3]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[2]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[1]),
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[0]);
-
- #endif
- // =================
- // END: GameText
- // =================
- }
-
- // ======================
- // BEGIN: GetPlayerSkin
- // ======================
- #if FIX_GetPlayerSkin
- #if FIXES_Single
- FIXES_gsPlayerSkin[playerid] = GetPlayerSkin(playerid);
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerSkin, GetPlayerSkin(playerid));
- #endif
- #endif
- // ======================
- // END: GetPlayerSkin
- // ======================
-
- // =================================
- // BEGIN: TogglePlayerControllable
- // =================================
- #if FIX_TogglePlayerControllable
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
- #endif
- // =================================
- // END: TogglePlayerControllable
- // =================================
-
- return FIXES_OnPlayerSpawn(playerid);
- }
-
- #if defined _ALS_OnPlayerSpawn
- #error _ALS_OnPlayerSpawn defined
- #endif
- #define _ALS_OnPlayerSpawn
- #define OnPlayerSpawn(%0) FIXES_OnPlayerSpawn(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerSpawn(playerid);
- #endif
- /*
- * OnVehicleMod(playerid, vehicleid, componentid)
- *
- * FIXES:
- * OnVehicleMod
- */
- #if FIX_OnVehicleMod
- public OnVehicleMod(playerid, vehicleid, componentid)
- {
- #if !FIXES_Single
- if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
- {
- return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
- }
- #endif
-
- // =====================
- // BEGIN: OnVehicleMod
- // =====================
- new
- modelid = GetVehicleModel(vehicleid);
- if (_FIXES_IN_RANGE(modelid, 400, 611 + 1))
- {
- switch (componentid)
- {
- case 1000 .. 1191:
- {
- if (FIXES_gscVehicleMods[(modelid - 400) * 6 + (componentid - 1000 >>> 5)] & 1 << (componentid - 1000 & 0b00011111))
- {
- return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
- }
- }
- case 1192, 1193:
- {
- if (modelid == 576)
- {
- // This save a whole cell off EVERY other vehicle! This
- // is the ONLY vehicle with any mods over "6 * 32 + 999"
- // (1191), the highest value you can fit in 6 cells of a
- // bit array (minus 1000).
- return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
- }
- }
- }
- }
- // Desync the player entirely.
- FIXES_BlockUpdate(playerid, true);
- return 0;
- // =====================
- // END: OnVehicleMod
- // =====================
- }
-
- #if defined _ALS_OnVehicleMod
- #error _ALS_OnVehicleMod defined
- #endif
- #define _ALS_OnVehicleMod
- #define OnVehicleMod(%0) FIXES_OnVehicleMod(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnVehicleMod(playerid, vehicleid, componentid);
- #endif
- /*
- * FIXES_SetPlayerSkin(playerid, skinid)
- *
- * FIXES:
- * GetPlayerSkin
- * SetPlayerSkin
- */
- #if defined _ALS_SetPlayerSkin
- #error _ALS_SetPlayerSkin defined
- #endif
- native BAD_SetPlayerSkin(playerid, skinid) = SetPlayerSkin;
- #if FIX_GetPlayerSkin || FIX_SetPlayerSkin
- stock FIXES_SetPlayerSkin(playerid, skinid)
- {
- // ======================
- // BEGIN: SetPlayerSkin
- // ======================
- #if FIX_SetPlayerSkin
- new
- vehicleid = GetPlayerVehicleID(playerid);
- if (vehicleid)
- {
- new
- seat = GetPlayerVehicleSeat(playerid);
- ClearAnimations(playerid);
- new
- ret = SetPlayerSkin(playerid, skinid);
- PutPlayerInVehicle(playerid, vehicleid, seat);
-
- // ======================
- // BEGIN: GetPlayerSkin
- // ======================
- #if FIX_GetPlayerSkin
- #if FIXES_Single
- FIXES_gsPlayerSkin[playerid] = skinid;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);
- #endif
- #endif
- // ======================
- // END: GetPlayerSkin
- // ======================
-
- return ret;
- }
-
- // ======================
- // BEGIN: GetPlayerSkin
- // ======================
- #if FIX_GetPlayerSkin
- else
- #endif
- // ======================
- // END: GetPlayerSkin
- // ======================
- #endif
- // ======================
- // END: SetPlayerSkin
- // ======================
-
- // ======================
- // BEGIN: GetPlayerSkin
- // ======================
- #if FIX_GetPlayerSkin
- // Watch fot the "else" above if this code ever changes.
- #if FIXES_Single
- FIXES_gsPlayerSkin[playerid] = skinid;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);
- #endif
- #endif
- // ======================
- // END: GetPlayerSkin
- // ======================
-
- return SetPlayerSkin(playerid, skinid);
- }
-
- #define _ALS_SetPlayerSkin
- #define SetPlayerSkin FIXES_SetPlayerSkin
- #endif
- /*
- * FIXES_GetPlayerSkin(playerid, skinid)
- *
- * FIXES:
- * GetPlayerSkin
- */
- #if defined _ALS_GetPlayerSkin
- #error _ALS_GetPlayerSkin defined
- #endif
- native BAD_GetPlayerSkin(playerid) = GetPlayerSkin;
- #if FIX_GetPlayerSkin
- stock FIXES_GetPlayerSkin(playerid)
- {
- #if FIXES_Single
- return FIXES_gsPlayerSkin[playerid];
- #else
- return GetPVarInt(playerid, FIXES_pvarPlayerSkin);
- #endif
- }
-
- #define _ALS_GetPlayerSkin
- #define GetPlayerSkin FIXES_GetPlayerSkin
- #endif
- /*
- * FIXES_GetWeaponName(weaponid, weapon[], len)
- *
- * FIXES:
- * GetWeaponName
- */
- #if defined _ALS_GetWeaponName
- #error _ALS_GetWeaponName defined
- #endif
- native BAD_GetWeaponName(weaponid, weapon[], len) = GetWeaponName;
- #if FIX_GetWeaponName
- stock FIXES_GetWeaponName(weaponid, weapon[], len)
- {
- switch (weaponid)
- {
- case 18:
- {
- return
- weapon[0] = 0,
- strcat(weapon, "Molotov Cocktail", len),
- 1;
- }
- case 44:
- {
- return
- weapon[0] = 0,
- strcat(weapon, "Thermal Goggles", len),
- 1;
- }
- case 45:
- {
- return
- weapon[0] = 0,
- strcat(weapon, "Night Vision Goggles", len),
- 1;
- }
- default:
- {
- return GetWeaponName(weaponid, weapon, len);
- }
- }
- return 0;
- }
-
- #define _ALS_GetWeaponName
- #define GetWeaponName FIXES_GetWeaponName
- #endif
- /*
- * OnPlayerUpdate(playerid)
- *
- * FIXES:
- * SetPlayerWorldBounds
- * TogglePlayerControllable
- * AllowInteriorWeapons
- * OnPlayerDeath
- * Kick
- * OnVehicleMod
- * OnPlayerEnterVehicle
- * OnPlayerEnterVehicle_2
- */
- #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_AllowInteriorWeapons || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_OnPlayerDeath || FIX_Kick || FIX_OnVehicleMod
- public OnPlayerUpdate(playerid)
- {
- // =============================
- // BEGIN: OnPlayerEnterVehicle
- // =============================
- #if FIX_OnPlayerEnterVehicle || FIX_Kick || FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle_2
- if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_BLOCK)
- {
- return 0;
- }
- #endif
- // =============================
- // END: OnPlayerEnterVehicle
- // =============================
-
- #if !FIXES_Single
- if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
- {
- return FIXES_OnPlayerUpdate(playerid);
- }
- #endif
-
- #if FIX_OnPlayerEnterVehicle || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
- new
- e_FIXES_BOOLS:pbools = FIXES_gsPlayerBools[playerid];
- #endif
-
- // =============================
- // BEGIN: AllowInteriorWeapons
- // =============================
- #if FIX_AllowInteriorWeapons
- if (pbools & e_FIXES_BOOLS_INTERIOR)
- {
- // DONE: May need integration with "FIX_GetPlayerWeapon".
- SetPlayerArmedWeapon(playerid, 0);
- }
- #endif
- // ============================
- // END: AllowInteriorWeapons
- // ============================
-
- #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
- new
- ud,
- lr,
- keys;
- GetPlayerKeys(playerid, keys, ud, lr);
- #endif
-
- #if FIX_SetPlayerWorldBounds && !FIX_TogglePlayerControllable
- #pragma unused ud, lr
- #endif
-
- // =============================
- // BEGIN: SetPlayerWorldBounds
- // =============================
- #if FIX_SetPlayerWorldBounds
- if (pbools & e_FIXES_BOOLS_WORLDBOUNDS && keys & _FIXES_KEY_AIM)
- {
- new
- Float:x,
- Float:y,
- Float:z;
- GetPlayerPos(playerid, x, y, z);
- if (FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] < x < FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] && FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] < y < FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY])
- {
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = x,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = y,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = z;
- }
- else
- {
- SetPlayerPos(playerid, FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX], FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY], FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ]);
- }
- }
- #endif
- // =============================
- // END: SetPlayerWorldBounds
- // =============================
-
- // ======================
- // BEGIN: OnPlayerDeath
- // ======================
- #if FIX_OnPlayerDeath
- FIXES_gsLastAnimation[playerid] = GetPlayerAnimationIndex(playerid);
- #endif
- // ======================
- // END: OnPlayerDeath
- // ======================
-
- // =================================
- // BEGIN: TogglePlayerControllable
- // =================================
- #if FIX_TogglePlayerControllable
- // MUST come last.
- if (pbools & e_FIXES_BOOLS_UNCONTROLLABLE)
- {
- // Keys based sync blocking, modified based on a post by Slice:
- // http://forum.sa-mp.com/showpost.php?p=876854 Use "playerid"
- // here as it's a variable that already exists, but note that
- // after this point, you CANNOT use "playerid" as it has been
- // "clobbered" (and yes, that's the technical term). This is
- // just to avoid "statement has no effect" warnings. ALWAYS
- // return 0 in this case, regardless of what other callbacks
- // return.
- playerid = FIXES_OnPlayerUpdate(playerid);
- if (keys || ud || lr)
- {
- return 0;
- }
- else
- {
- return playerid;
- }
- }
- #endif
- // =================================
- // END: TogglePlayerControllable
- // =================================
-
- return FIXES_OnPlayerUpdate(playerid);
- }
-
- #if defined _ALS_OnPlayerUpdate
- #error _ALS_OnPlayerUpdate defined
- #endif
- #define _ALS_OnPlayerUpdate
- #define OnPlayerUpdate(%0) FIXES_OnPlayerUpdate(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerUpdate(playerid);
- #endif
- /*
- * FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
- *
- * TODO: Modify this to remove aim animations when they get to the boundaries.
- *
- * FIXES:
- * SetPlayerWorldBounds
- */
- #if defined _ALS_SetPlayerWorldBounds
- #error _ALS_SetPlayerWorldBounds defined
- #endif
- native BAD_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) = SetPlayerWorldBounds;
- #if FIX_SetPlayerWorldBounds
- #if FIXES_Single
- stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- FIXES_PRINTF("Call SetPlayerWorldBounds");
- if (x_max == x_min || y_max == y_min)
- {
- // Impossibly small area, disable checks entirely.
- return
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS,
- SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY);
- }
- // This code could do with a way to mostly remove the checks. Maybe
- // when setting everything to FIXES_INFINITY (with default
- // parameters).
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;
- new
- Float:tmp;
- if (x_max < x_min)
- {
- tmp = x_min,
- x_min = x_max,
- x_max = tmp;
- }
- if (y_max < y_min)
- {
- tmp = y_min,
- y_min = y_max,
- y_max = tmp;
- }
- // Give a little leway so this fix isn't noticed if you're not
- // trying to break through the world bounds. Leway removed in
- // favour of keys.
- return
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max,
-
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max,
-
- GetPlayerPos(playerid, tmp, tmp, tmp),
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp,
-
- SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min);
- }
- return 0;
- }
- #else
- forward _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min);
-
- stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- FIXES_PRINTF("Call SetPlayerWorldBounds");
- return
- CallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@iffff, playerid, x_max, x_min, y_max, y_min),
- getproperty(5, FIXES_gscReturnProperty);
- }
- return 0;
- }
-
- public _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
- {
- FIXES_PRINTF("_FIXES_SetPlayerWorldBounds: %d %.2f %.2f %.2f %.2f", playerid, x_max, x_min, y_max, y_min);
- _FIXES_IS_IN_CHARGE()
- {
- FIXES_PRINTF("SetPlayerWorldBounds");
- //if (x_max == _FIXES_INFINITY && x_min == _FIXES_INFINITY && y_max == _FIXES_INFINITY && y_min == _FIXES_INFINITY)
- if (x_max == x_min || y_max == y_min)
- {
- // Impossibly small area, disable checks entirely.
- return
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] =
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] =
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] =
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] =
- 0.0,
- setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY)),
- -1;
- }
- // This code could do with a way to mostly remove the checks. Maybe
- // when setting everything to FIXES_INFINITY (with default
- // parameters).
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;
- new
- Float:tmp;
- if (x_max < x_min)
- {
- tmp = x_min,
- x_min = x_max,
- x_max = tmp;
- }
- if (y_max < y_min)
- {
- tmp = y_min,
- y_min = y_max,
- y_max = tmp;
- }
- // Give a little leway so this fix isn't noticed if you're not
- // trying to break through the world bounds. Leway removed in
- // favour of keys.
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max,
-
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max,
-
- GetPlayerPos(playerid, tmp, tmp, tmp),
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min,
- FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp,
-
- setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min));
- }
- return 0;
- }
- #endif
-
- #define _ALS_SetPlayerWorldBounds
- #define SetPlayerWorldBounds FIXES_SetPlayerWorldBounds
- #endif
- /*
- * FIXES_TogglePlayerControllable(playerid, toggle)
- *
- * FIXES:
- * TogglePlayerControllable
- */
- #if defined _ALS_TogglePlayerControllable
- #error _ALS_TogglePlayerControllable defined
- #endif
- native BAD_TogglePlayerControllable(playerid, toggle) = TogglePlayerControllable;
- #if FIX_TogglePlayerControllable
- #if FIXES_Single
- stock FIXES_TogglePlayerControllable(playerid, toggle)
- {
- if (TogglePlayerControllable(playerid, toggle))
- {
- if (toggle)
- {
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
- }
- else
- {
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;
- }
- return 1;
- }
- return 0;
- }
- #else
- forward _FIXES_TogglePlayerControllable(playerid, toggle);
-
- stock FIXES_TogglePlayerControllable(playerid, toggle)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- return
- CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, playerid, toggle),
- getproperty(5, FIXES_gscReturnProperty);
- }
- return 0;
- }
-
- public _FIXES_TogglePlayerControllable(playerid, toggle)
- {
- _FIXES_IS_IN_CHARGE()
- {
- if (toggle)
- {
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
- }
- else
- {
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;
- }
- setproperty(5, FIXES_gscReturnProperty, TogglePlayerControllable(playerid, toggle));
- }
- }
- #endif
-
- #define _ALS_TogglePlayerControllable
- #define TogglePlayerControllable FIXES_TogglePlayerControllable
- #endif
- /*
- * OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
- *
- * FIXES:
- * AllowInteriorWeapons
- * GetPlayerInterior
- */
- #if FIX_AllowInteriorWeapons || FIX_GetPlayerInterior
- public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
- {
- // ==========================
- // BEGIN: GetPlayerInterior
- // ==========================
- #if FIX_GetPlayerInterior
- #if FIXES_Single
- FIXES_gsInterior[playerid] = newinteriorid;
- #else
- _FIXES_IS_IN_CHARGE()
- {
- SetPVarInt(playerid, FIXES_pvarPlayerInterior, newinteriorid);
- }
- #endif
- #endif
- // ==========================
- // END: GetPlayerInterior
- // ==========================
-
- // =============================
- // BEGIN: AllowInteriorWeapons
- // =============================
- #if FIX_AllowInteriorWeapons
- if (newinteriorid)
- {
- if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR)
- {
- // This only needs doing here if "GetPlayerWeapon" is set.
- // If it isn't, even though "AllowInteriorWeapons" can use
- // this code on its own, it doesn't as "OnPlayerUpdate"
- // takes care of it all.
- // TODO: Rewrite this code to use a single bit to indicate
- // if a player can have a weapon or not, and just use the in
- // the "OnPlayerUpdate" callback, instead of several checks.
- // DONE!
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_INTERIOR;
- _FIXES_IS_IN_CHARGE()
- {
- SetPlayerArmedWeapon(playerid, 0);
- #if FIX_GetPlayerWeapon
- if (IsPlayerInAnyVehicle(playerid))
- {
- #if FIXES_Single
- FIXES_gsPlayerWeapon[playerid] = 0;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
- #endif
- }
- #endif
- }
- }
- }
- else
- {
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_INTERIOR;
- }
- #endif
- // ===========================
- // END: AllowInteriorWeapons
- // ===========================
- return FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
- }
-
- #if defined _ALS_OnPlayerInteriorChange
- #error _ALS_OnPlayerInteriorChange defined
- #endif
- #define _ALS_OnPlayerInteriorChange
- #define OnPlayerInteriorChange(%0) FIXES_OnPlayerInteriorChange(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
- #endif
- /*
- * _FIXES_DriveBy(playerid)
- *
- * FIXES:
- * DriveBy
- */
- #if FIX_DriveBy
- forward _FIXES_DriveBy(playerid);
-
- public _FIXES_DriveBy(playerid)
- {
- if (GetPlayerState(playerid) == PLAYER_STATE_PASSENGER)
- {
- SetPlayerArmedWeapon(playerid, FIXES_gsDriveByWeapon[playerid]);
- }
- return FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_DRIVE_BY;
- }
- #endif
- /*
- * OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
- *
- * FIXES:
- * DriveBy
- */
- #if FIX_DriveBy
- public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
- {
- // ===============================
- // BEGIN: DriveBy
- // ===============================
- #if FIX_DriveBy
- #if !FIXES_Single
- if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
- #endif
- {
- if ((newkeys & KEY_CROUCH) && !(oldkeys & KEY_CROUCH) && GetPlayerState(playerid) == PLAYER_STATE_PASSENGER && GetPlayerCameraMode(playerid) == 55 && !(FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_DRIVE_BY))
- {
- FIXES_gsDriveByWeapon[playerid] = GetPlayerWeapon(playerid),
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_DRIVE_BY,
- SetPlayerArmedWeapon(playerid, 0),
- ApplyAnimation(playerid, "PED", "CAR_GETIN_RHS", 4.1, 0, 0, 0, 0, 1, 1),
- SetTimerEx(FIXES_gscDriveBy, 500, 0, FIXES_gscSpec@i, playerid);
- }
- }
- #endif
- // =============================
- // END: DriveBy
- // =============================
-
- return FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
- }
-
- #if defined _ALS_OnPlayerKeyStateChange
- #error _ALS_OnPlayerKeyStateChange defined
- #endif
- #define _ALS_OnPlayerKeyStateChange
- #define OnPlayerKeyStateChange(%0) FIXES_OnPlayerKeyStateChange(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
- #endif
- /*
- * OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
- *
- * FIXES:
- * OnPlayerEnterVehicle_2
- */
- #if FIX_OnPlayerEnterVehicle_2
- public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
- {
- // ===============================
- // BEGIN: OnPlayerEnterVehicle_2
- // ===============================
- #if FIX_OnPlayerEnterVehicle_2
- if (0 < vehicleid < MAX_VEHICLES)
- {
- return FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
- }
- FIXES_BlockUpdate(playerid, true);
- return 0;
- #endif
- // =============================
- // END: OnPlayerEnterVehicle_2
- // =============================
- }
-
- #if defined _ALS_OnPlayerEnterVehicle
- #error _ALS_OnPlayerEnterVehicle defined
- #endif
- #define _ALS_OnPlayerEnterVehicle
- #define OnPlayerEnterVehicle(%0) FIXES_OnPlayerEnterVehicle(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
- #endif
- /*
- * OnPlayerExitVehicle(playerid, vehicleid)
- *
- * FIXES:
- * OnPlayerEnterVehicle_2
- */
- #if FIX_OnPlayerEnterVehicle_2
- public OnPlayerExitVehicle(playerid, vehicleid)
- {
- // ===============================
- // BEGIN: OnPlayerEnterVehicle_2
- // ===============================
- #if FIX_OnPlayerEnterVehicle_2
- if (0 < vehicleid < MAX_VEHICLES)
- {
- return FIXES_OnPlayerExitVehicle(playerid, vehicleid);
- }
- FIXES_BlockUpdate(playerid, true);
- return 0;
- #endif
- // =============================
- // END: OnPlayerEnterVehicle_2
- // =============================
- }
-
- #if defined _ALS_OnPlayerExitVehicle
- #error _ALS_OnPlayerExitVehicle defined
- #endif
- #define _ALS_OnPlayerExitVehicle
- #define OnPlayerExitVehicle(%0) FIXES_OnPlayerExitVehicle(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerExitVehicle(playerid, vehicleid);
- #endif
- /*
- * FIXES_BlockUpdate(playerid, bool:block)
- *
- * Block a player from using OnPlayerUpdate at all.
- */
- #if FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_Kick || FIX_OnVehicleMod
- static stock FIXES_BlockUpdate(playerid, bool:block, kick = 6)
- {
- if (kick)
- {
- #if FIXES_SilentKick
- new
- ip[22];
- GetPlayerIp(playerid, ip, sizeof (ip)),
- format(ip, sizeof (ip), "banip %s", ip),
- SendRconCommand(ip),
- FIXES_gsPlayerIP[playerid] = strval(ip[kick]) << 24,
- kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
- FIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 16,
- kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
- FIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 8,
- kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
- FIXES_gsPlayerIP[playerid] |= strval(ip[kick]);
- #else
- Kick(playerid);
- #endif
- }
- if (block)
- {
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_BLOCK;
- return 0;
- }
- else
- {
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_BLOCK;
- return 1;
- }
- }
- #endif
- /*
- * OnPlayerSelectedMenuRow(playerid, row)
- *
- * FIXES:
- * GetPlayerMenu
- */
- #if FIX_GetPlayerMenu
- public OnPlayerSelectedMenuRow(playerid, row)
- {
- // ======================
- // BEGIN: GetPlayerMenu
- // ======================
- #if FIXES_Single
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
- new
- ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
- if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
- {
- FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
- }
- return ret;
- #else
- new
- Menu:cur = FIXES_gsCurrentMenu[playerid];
- _FIXES_IS_IN_CHARGE()
- {
- setproperty(5, FIXES_gscMenuProperty, _:cur);
- CallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid);
- FIXES_gsCurrentMenu[playerid] = cur;
- new
- ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
- if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
- {
- FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
- }
- return ret;
- }
- else
- {
- FIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty);
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
- new
- ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
- if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
- {
- FIXES_gsCurrentMenu[playerid] = cur;
- }
- return ret;
- }
- #endif
- // ======================
- // END: GetPlayerMenu
- // ======================
- }
-
- #if defined _ALS_OnPlayerSelectedMenuRow
- #error _ALS_OnPlayerSelectedMenuRow defined
- #endif
- #define _ALS_OnPlayerSelectedMenuRow
- #define OnPlayerSelectedMenuRow(%0) FIXES_OnPlayerSelectedMenuRow(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerSelectedMenuRow(playerid, row);
- #endif
- /*
- * OnPlayerExitedMenu(playerid)
- *
- * FIXES:
- * GetPlayerMenu
- */
- #if FIX_GetPlayerMenu
- public OnPlayerExitedMenu(playerid)
- {
- // ======================
- // BEGIN: GetPlayerMenu
- // ======================
- #if FIXES_Single
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
- new
- ret = FIXES_OnPlayerExitedMenu(playerid);
- if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
- {
- FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
- }
- return ret;
- #else
- new
- Menu:cur = FIXES_gsCurrentMenu[playerid];
- _FIXES_IS_IN_CHARGE()
- {
- setproperty(5, FIXES_gscMenuProperty, _:cur);
- CallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid);
- FIXES_gsCurrentMenu[playerid] = cur;
- new
- ret = FIXES_OnPlayerExitedMenu(playerid);
- if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
- {
- FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
- }
- return ret;
- }
- else
- {
- FIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty);
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
- new
- ret = FIXES_OnPlayerExitedMenu(playerid);
- if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
- {
- FIXES_gsCurrentMenu[playerid] = cur;
- }
- return ret;
- }
- #endif
- // ======================
- // END: GetPlayerMenu
- // ======================
- }
-
- #if defined _ALS_OnPlayerExitedMenu
- #error _ALS_OnPlayerExitedMenu defined
- #endif
- #define _ALS_OnPlayerExitedMenu
- #define OnPlayerExitedMenu(%0) FIXES_OnPlayerExitedMenu(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerExitedMenu(playerid);
- #endif
- /*
- * FIXES_IS_VALID_MENU(Menu:menuid)
- *
- * FIXES:
- * Menus
- */
- #if _FIX_Menus
- #define FIXES_IS_VALID_MENU(%0) (_FIXES_IN_RANGE(_:(%0), 0, MAX_MENUS) && (FIXES_gsValidMenus[_:(%0) >>> 5] & (1 << (_:(%0) & 0x1F))))
- #endif
- /*
- * Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0)
- *
- * FIXES:
- * Menus
- */
- #if defined _ALS_CreateMenu
- #error _ALS_CreateMenu defined
- #endif
- native Menu:BAD_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0) = CreateMenu;
- #if _FIX_Menus
- #if !FIXES_Single
- forward _FIXES_CreateMenu(ret);
-
- public _FIXES_CreateMenu(ret)
- {
- FIXES_gsValidMenus[ret >>> 5] |= 1 << (ret & 0x1F);
- }
- #endif
-
- stock Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0)
- {
- new
- Menu:ret = CreateMenu(title, columns, x, y, col1width, col2width);
- if (_FIXES_IN_RANGE(_:ret, 0, MAX_MENUS))
- {
- #if FIXES_Single
- FIXES_gsValidMenus[_:ret >>> 5] |= 1 << (_:ret & 0x1F);
- #else
- CallRemoteFunction("_FIXES_CreateMenu", FIXES_gscSpec@i, _:ret);
- #endif
- }
- return ret;
- }
-
- #define _ALS_CreateMenu
- #define CreateMenu FIXES_CreateMenu
- #endif
- /*
- * _FIXES_SetPlayerMenu(playerid, Menu:menuid)
- *
- * FIXES:
- * GetPlayerMenu
- */
- #if FIX_GetPlayerMenu && !FIXES_Single
- forward _FIXES_SetPlayerMenu(playerid, Menu:menuid);
-
- public _FIXES_SetPlayerMenu(playerid, Menu:menuid)
- {
- FIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET;
- FIXES_gsCurrentMenu[playerid] = menuid;
- }
- #endif
- /*
- * _FIXES_ClearPlayerMenu(playerid)
- *
- * FIXES:
- * GetPlayerMenu
- */
- #if FIX_GetPlayerMenu && !FIXES_Single
- forward _FIXES_ClearPlayerMenu(playerid);
-
- public _FIXES_ClearPlayerMenu(playerid)
- {
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
- FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
- }
- #endif
- /*
- * Menu:FIXES_DestroyMenu(Menu:menuid)
- *
- * FIXES:
- * GetPlayerMenu
- */
- #if defined _ALS_DestroyMenu
- #error _ALS_DestroyMenu defined
- #endif
- native BAD_DestroyMenu(Menu:menuid) = DestroyMenu;
- #if _FIX_Menus || FIX_GetPlayerMenu
- #if _FIX_Menus && !FIXES_Single
- forward _FIXES_DestroyMenu(ret);
-
- public _FIXES_DestroyMenu(ret)
- {
- FIXES_gsValidMenus[ret >>> 5] &= ~(1 << (ret & 0x1F));
- }
- #endif
-
- stock FIXES_DestroyMenu(Menu:menuid)
- {
- #if _FIX_Menus
- if (FIXES_IS_VALID_MENU(menuid))
- #endif
- {
- if (DestroyMenu(Menu:menuid))
- {
- #if _FIX_Menus
- #if FIXES_Single
- FIXES_gsValidMenus[_:menuid >>> 5] &= ~(1 << (_:menuid & 0x1F));
- #else
- CallRemoteFunction("_FIXES_DestroyMenu", FIXES_gscSpec@i, _:menuid);
- #endif
- #endif
- _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
- {
- if (FIXES_gsCurrentMenu[playerid] == menuid)
- {
- if (HideMenuForPlayer(menuid, playerid))
- {
- #if FIXES_Single
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
- FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
- #else
- CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU);
- #endif
- }
- }
- }
- return 1;
- }
- }
- return 0;
- }
-
- #define _ALS_DestroyMenu
- #define DestroyMenu FIXES_DestroyMenu
- #endif
- /*
- * FIXES_AddMenuItem(Menu:menuid, column, const menutext[])
- *
- * FIXES:
- * AddMenuItem
- */
- #if defined _ALS_AddMenuItem
- #error _ALS_AddMenuItem defined
- #endif
- native BAD_AddMenuItem(Menu:menuid, column, const menutext[]) = AddMenuItem;
- #if FIX_AddMenuItem
- stock FIXES_AddMenuItem(Menu:menuid, column, const menutext[])
- {
- if (FIXES_IS_VALID_MENU(menuid))
- {
- return AddMenuItem(menuid, column, menutext);
- }
- return 0;
- }
-
- #define _ALS_AddMenuItem
- #define AddMenuItem FIXES_AddMenuItem
- #endif
- /*
- * FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[])
- *
- * FIXES:
- * SetMenuColumnHeader
- */
- #if defined _ALS_SetMenuColumnHeader
- #error _ALS_SetMenuColumnHeader defined
- #endif
- native BAD_SetMenuColumnHeader(Menu:menuid, column, const columnheader[]) = SetMenuColumnHeader;
- #if FIX_SetMenuColumnHeader
- stock FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[])
- {
- if (FIXES_IS_VALID_MENU(menuid))
- {
- return SetMenuColumnHeader(menuid, column, columnheader);
- }
- return 0;
- }
-
- #define _ALS_SetMenuColumnHeader
- #define SetMenuColumnHeader FIXES_SetMenuColumnHeader
- #endif
- /*
- * FIXES_ShowMenuForPlayer(Menu:menuid, playerid)
- *
- * FIXES:
- * ShowMenuForPlayer
- * GetPlayerMenu
- */
- #if defined _ALS_ShowMenuForPlayer
- #error _ALS_ShowMenuForPlayer defined
- #endif
- native BAD_ShowMenuForPlayer(Menu:menuid, playerid) = ShowMenuForPlayer;
- #if FIX_ShowMenuForPlayer || FIX_GetPlayerMenu
- stock FIXES_ShowMenuForPlayer(Menu:menuid, playerid)
- {
- #if FIX_ShowMenuForPlayer
- if (FIXES_IS_VALID_MENU(menuid))
- #endif
- {
- #if FIX_GetPlayerMenu
- if (ShowMenuForPlayer(menuid, playerid))
- {
- #if FIXES_Single
- FIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET;
- FIXES_gsCurrentMenu[playerid] = menuid;
- #else
- CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, _:menuid);
- #endif
- return 1;
- }
- #else
- return ShowMenuForPlayer(menuid, playerid);
- #endif
- }
- return 0;
- }
-
- #define _ALS_ShowMenuForPlayer
- #define ShowMenuForPlayer FIXES_ShowMenuForPlayer
- #endif
- /*
- * FIXES_HideMenuForPlayer(Menu:menuid, playerid)
- *
- * FIXES:
- * HideMenuForPlayer
- * HideMenuForPlayer_2
- * GetPlayerMenu
- */
- #if defined _ALS_HideMenuForPlayer
- #error _ALS_HideMenuForPlayer defined
- #endif
- native BAD_HideMenuForPlayer(Menu:menuid, playerid) = HideMenuForPlayer;
- #if FIX_HideMenuForPlayer || FIX_GetPlayerMenu
- stock FIXES_HideMenuForPlayer(Menu:menuid, playerid)
- {
- #if FIX_HideMenuForPlayer
- if (FIXES_IS_VALID_MENU(menuid))
- #endif
- {
- #if FIX_GetPlayerMenu
- #if FIX_HideMenuForPlayer_2
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS) && FIXES_gsCurrentMenu[playerid] == menuid)
- #else
- if (FIXES_gsCurrentMenu[playerid] == menuid && HideMenuForPlayer(menuid, playerid))
- #endif
- {
- #if FIXES_Single
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
- FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
- #else
- CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU);
- #endif
- #if FIX_HideMenuForPlayer_2
- return HideMenuForPlayer(menuid, playerid);
- #else
- return 1;
- #endif
- }
- #else
- return HideMenuForPlayer(menuid, playerid);
- #endif
- }
- return 0;
- }
-
- #define _ALS_HideMenuForPlayer
- #define HideMenuForPlayer FIXES_HideMenuForPlayer
- #endif
- /*
- * FIXES_DisableMenu(Menu:menuid)
- *
- * FIXES:
- * DisableMenu
- */
- #if defined _ALS_DisableMenu
- #error _ALS_DisableMenu defined
- #endif
- native BAD_DisableMenu(Menu:menuid) = DisableMenu;
- #if FIX_DisableMenu
- stock FIXES_DisableMenu(Menu:menuid)
- {
- if (FIXES_IS_VALID_MENU(menuid))
- {
- return DisableMenu(menuid);
- }
- return 0;
- }
-
- #define _ALS_DisableMenu
- #define DisableMenu FIXES_DisableMenu
- #endif
- /*
- * FIXES_DisableMenuRow(Menu:menuid, row)
- *
- * FIXES:
- * DisableMenuRow
- */
- #if defined _ALS_DisableMenuRow
- #error _ALS_DisableMenuRow defined
- #endif
- native BAD_DisableMenuRow(Menu:menuid, row) = DisableMenuRow;
- #if FIX_DisableMenuRow
- stock FIXES_DisableMenuRow(Menu:menuid, row)
- {
- if (FIXES_IS_VALID_MENU(menuid))
- {
- return DisableMenuRow(menuid, row);
- }
- return 0;
- }
-
- #define _ALS_DisableMenuRow
- #define DisableMenuRow FIXES_DisableMenuRow
- #endif
- /*
- * Menu:FIXES_GetPlayerMenu(playerid)
- *
- * FIXES:
- * GetPlayerMenu
- */
- #if defined _ALS_GetPlayerMenu
- #error _ALS_GetPlayerMenu defined
- #endif
- native BAD_GetPlayerMenu(playerid) = GetPlayerMenu;
- #if FIX_GetPlayerMenu
- stock Menu:FIXES_GetPlayerMenu(playerid)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- return FIXES_gsCurrentMenu[playerid];
- }
- return Menu:INVALID_MENU;
- }
-
- #define _ALS_GetPlayerMenu
- #define GetPlayerMenu FIXES_GetPlayerMenu
- #endif
- /*
- * OnPlayerStateChange(playerid, newstate, oldstate)
- *
- * FIXES:
- * HydraSniper
- * GetPlayerWeapon
- * PutPlayerInVehicle
- * TrainExit
- */
- #if FIX_HydraSniper || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_TrainExit
- public OnPlayerStateChange(playerid, newstate, oldstate)
- {
- #if !FIXES_Single
- if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
- {
- return FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
- }
- #endif
-
- // =============================
- // BEGIN: OnPlayerEnterVehicle
- // =============================
- #if FIX_OnPlayerEnterVehicle
- if (newstate == PLAYER_STATE_PASSENGER)
- {
- new
- model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400;
- if (_FIXES_IN_RANGE(model, 0, 211 + 1))
- {
- new
- seat = GetPlayerVehicleSeat(playerid);
- if (seat != 128)
- {
- model = (FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2)) & 0xF;
- if (model == 0 || model == 15)
- {
- // Shouldn't be in this vehicle at all.
- FIXES_BlockUpdate(playerid, true);
- }
- else if (!(0 < seat <= model)) // Slower with "_FIXES_NO_RANGE".
- {
- // In an out of range seat.
- FIXES_BlockUpdate(playerid, true);
- }
- }
- }
- else
- {
- FIXES_BlockUpdate(playerid, true);
- }
- }
- else if (newstate == PLAYER_STATE_DRIVER)
- {
- new
- model = GetPlayerVehicleSeat(playerid);
- if (model != 128)
- {
- if (model == 0)
- {
- model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400;
- if (_FIXES_NO_RANGE(model, 0, 211 + 1) || FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2) & 0xF == 15)
- {
- // In an invalid vehicle (one you can't drive).
- FIXES_BlockUpdate(playerid, true);
- }
- }
- else
- {
- // They are a driver, but not in the driver's seat.
- FIXES_BlockUpdate(playerid, true);
- }
- }
- #if FIX_HydraSniper
- else
- {
- model = GetVehicleModel(GetPlayerVehicleID(playerid));
- }
- #endif
- #if !FIX_HydraSniper
- }
- #endif
- #endif
- // =============================
- // END: OnPlayerEnterVehicle
- // =============================
-
- // ====================
- // BEGIN: HydraSniper
- // ====================
- #if FIX_HydraSniper
- #if !FIX_OnPlayerEnterVehicle
- // Only called if the same check above isn't called.
- if (newstate == PLAYER_STATE_DRIVER)
- {
- new
- model = GetVehicleModel(GetPlayerVehicleID(playerid));
- #endif
- if (GetPlayerWeapon(playerid) == 34 && (model == 520 || model == 425))
- {
- SetPlayerArmedWeapon(playerid, 0);
- #if FIX_GetPlayerWeapon
- // This is the first cross-dependednt fix.
- #if FIXES_Single
- FIXES_gsPlayerWeapon[playerid] = 0;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
- #endif
- #endif
- }
- }
- #endif
- // ====================
- // END: HydraSniper
- // ====================
-
- #if FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_TrainExit
- #if PLAYER_STATE_PASSENGER != PLAYER_STATE_DRIVER + 1
- #error FIX_GetPlayerWeapon/FIX_PutPlayerInVehicle state assertation failed.
- #endif
- if (_FIXES_IN_RANGE(oldstate, PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER + 1))
- {
- #if FIX_PutPlayerInVehicle || FIX_TrainExit
- new
- e_FIXES_BOOLS:bools = FIXES_gsPlayerBools[playerid];
- #endif
-
- // ========================
- // BEGIN: GetPlayerWeapon
- // ========================
- #if FIX_GetPlayerWeapon
- #if FIXES_Single
- FIXES_gsPlayerWeapon[playerid] = -1;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);
- #endif
- #endif
- // ========================
- // END: GetPlayerWeapon
- // ========================
-
- // ==================
- // BEGIN: TrainExit
- // ==================
- #if FIX_TrainExit
- FIXES_PRINTF("train exit");
- if (bools & e_FIXES_BOOLS_PUT_IN_TRAIN)
- {
- FIXES_PRINTF("OK");
- SetCameraBehindPlayer(playerid),
- bools &= ~e_FIXES_BOOLS_PUT_IN_TRAIN;
- }
- #endif
- // ==================
- // END: TrainExit
- // ==================
-
- // ===========================
- // BEGIN: PutPlayerInVehicle
- // ===========================
- #if FIX_PutPlayerInVehicle
- // Update their vehicle once we KNOW the client has done the
- // removal from the vehicle.
- if (bools & e_FIXES_BOOLS_PUT_IN_VEHICLE)
- {
- new
- vid = FIXES_gsVehicleSeatData[playerid] & 0x00FFFFFF;
- // Limited to "only" 16777216 vehicles and 256 seats.
- PutPlayerInVehicle(playerid, vid, FIXES_gsVehicleSeatData[playerid] >>> 24),
- bools &= ~e_FIXES_BOOLS_PUT_IN_VEHICLE;
- #if FIX_TrainExit
- switch (GetVehicleModel(vid))
- {
- case 449, 537, 538:
- {
- bools |= e_FIXES_BOOLS_PUT_IN_TRAIN;
- }
- }
- #endif
- }
- #endif
- // ===========================
- // END: PutPlayerInVehicle
- // ===========================
-
- #if FIX_PutPlayerInVehicle || FIX_TrainExit
- FIXES_gsPlayerBools[playerid] = bools;
- #endif
- }
- #endif
-
- return FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
- }
-
- #if defined _ALS_OnPlayerStateChange
- #error _ALS_OnPlayerStateChange defined
- #endif
- #define _ALS_OnPlayerStateChange
- #define OnPlayerStateChange(%0) FIXES_OnPlayerStateChange(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
- #endif
- /*
- * FIXES_GivePlayerWeapon(playerid, weaponid, ammo)
- *
- * FIXES:
- * HydraSniper
- */
- #if defined _ALS_GivePlayerWeapon
- #error _ALS_GivePlayerWeapon defined
- #endif
- native BAD_GivePlayerWeapon(playerid, weaponid, ammo) = GivePlayerWeapon;
- #if FIX_HydraSniper
- stock FIXES_GivePlayerWeapon(playerid, weaponid, ammo)
- {
- new
- vid = GetPlayerVehicleID(playerid);
- if (vid)
- {
- vid = GetVehicleModel(vid);
- if (weaponid == 34 && (vid == 520 || vid == 425))
- {
- vid = GivePlayerWeapon(playerid, weaponid, ammo),
- SetPlayerArmedWeapon(playerid, 0);
- #if FIX_GetPlayerWeapon
- #if FIXES_Single
- FIXES_gsPlayerWeapon[playerid] = 0;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
- #endif
- #endif
- return vid;
- }
- }
- return GivePlayerWeapon(playerid, weaponid, ammo);
- }
-
- #define _ALS_GivePlayerWeapon
- #define GivePlayerWeapon FIXES_GivePlayerWeapon
- #endif
- /*
- * FIXES_SetPlayerArmedWeapon(playerid, weaponid)
- *
- * FIXES:
- * GetPlayerWeapon
- */
- #if defined _ALS_SetPlayerArmedWeapon
- #error _ALS_SetPlayerArmedWeapon defined
- #endif
- native BAD_SetPlayerArmedWeapon(playerid, weaponid) = SetPlayerArmedWeapon;
- #if FIX_GetPlayerWeapon
- stock FIXES_SetPlayerArmedWeapon(playerid, weaponid)
- {
- #if FIX_AllowInteriorWeapons
- if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR && GetPlayerInterior(playerid))
- {
- // Not allowed weapons.
- return 0;
- }
- #endif
- new
- vid = GetPlayerVehicleID(playerid);
- if (vid)
- {
- #if FIX_HydraSniper
- vid = GetVehicleModel(vid);
- if (weaponid == 34 && (vid == 520 || vid == 425))
- {
- return 0;
- }
- #endif
- //FIXES_gsPlayerWeapon[playerid] = weaponid;
- #if FIXES_Single
- FIXES_gsPlayerWeapon[playerid] = weaponid;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerWeapon, weaponid);
- #endif
- }
- return SetPlayerArmedWeapon(playerid, weaponid);
- }
-
- #define _ALS_SetPlayerArmedWeapon
- #define SetPlayerArmedWeapon FIXES_SetPlayerArmedWeapon
- #endif
- /*
- * FIXES_GetPlayerWeapon(playerid)
- *
- * FIXES:
- * GetPlayerWeapon
- */
- #if defined _ALS_GetPlayerWeapon
- #error _ALS_GetPlayerWeapon defined
- #endif
- native BAD_GetPlayerWeapon(playerid) = GetPlayerWeapon;
- #if FIX_GetPlayerWeapon
- stock FIXES_GetPlayerWeapon(playerid)
- {
- #if FIXES_Single
- new
- ret = FIXES_gsPlayerWeapon[playerid];
- #else
- new
- ret = GetPVarInt(playerid, FIXES_pvarPlayerWeapon);
- #endif
- if (ret == -1)
- {
- return GetPlayerWeapon(playerid);
- }
- return ret;
- }
-
- #define _ALS_GetPlayerWeapon
- #define GetPlayerWeapon FIXES_GetPlayerWeapon
- #endif
- /*
- * FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
- *
- * FIXES:
- * PutPlayerInVehicle
- */
- #if defined _ALS_PutPlayerInVehicle
- #error _ALS_PutPlayerInVehicle defined
- #endif
- native BAD_PutPlayerInVehicle(playerid, vehicleid, seatid) = PutPlayerInVehicle;
- #if FIX_PutPlayerInVehicle || FIX_TrainExit
- #if FIXES_Single
- stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
- {
- // ==================
- // BEGIN: TrainExit
- // ==================
- #if FIX_TrainExit
- FIXES_PRINTF("TrainExit %d", GetVehicleModel(vehicleid));
- switch (GetVehicleModel(vehicleid))
- {
- case 449, 537, 538:
- {
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
- }
- }
- #endif
- // ==================
- // END: TrainExit
- // ==================
-
- // ===========================
- // BEGIN: PutPlayerInVehicle
- // ===========================
- #if FIX_PutPlayerInVehicle
- new
- vid = GetPlayerVehicleID(playerid);
- if (vid)
- {
- new
- Float:x,
- Float:y,
- Float:z;
- // Remove them without the animation.
- return
- GetVehiclePos(vid, x, y, z),
- SetPlayerPos(playerid, x, y, z),
- FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid,
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE,
- 1;
- }
- #endif
- // ===========================
- // END: PutPlayerInVehicle
- // ===========================
- return PutPlayerInVehicle(playerid, vehicleid, seatid);
- }
- #else
- forward _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data);
-
- stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
- {
- FIXES_PRINTF("NOT SINGLE");
- // ===========================
- // BEGIN: PutPlayerInVehicle
- // ===========================
- #if FIX_PutPlayerInVehicle
- new
- vid = GetPlayerVehicleID(playerid);
- if (vid)
- {
- new
- Float:x,
- Float:y,
- Float:z;
- // Remove them without the animation.
- return
- GetVehiclePos(vid, x, y, z),
- SetPlayerPos(playerid, x, y, z),
- CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 1, vid),
- 1;
- }
- #endif
- // ===========================
- // END: PutPlayerInVehicle
- // ===========================
-
- // ==================
- // BEGIN: TrainExit
- // ==================
- #if FIX_TrainExit
- new
- model = GetVehicleModel(vehicleid);
- switch (model)
- {
- case 449, 537, 538:
- {
- CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 0, model);
- //FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
- }
- }
- #endif
- // ==================
- // END: TrainExit
- // ==================
- return PutPlayerInVehicle(playerid, vehicleid, seatid);
- }
-
- public _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data)
- {
- FIXES_PRINTF("IN CHARGE: %d", (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE));
- _FIXES_IS_IN_CHARGE()
- {
- // ===========================
- // BEGIN: PutPlayerInVehicle
- // ===========================
- #if FIX_PutPlayerInVehicle
- if (from)
- {
- FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid,
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE;
- }
- #endif
- // ===========================
- // END: PutPlayerInVehicle
- // ===========================
-
- // ==================
- // BEGIN: TrainExit
- // ==================
- #if FIX_TrainExit
- #if FIX_PutPlayerInVehicle
- else
- #else
- if (!from)
- #endif
- {
- switch (data)
- {
- case 449, 537, 538:
- {
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
- }
- }
- }
- #endif
- // ==================
- // END: TrainExit
- // ==================
- }
- return 1;
- }
- #endif
-
- #define _ALS_PutPlayerInVehicle
- #define PutPlayerInVehicle FIXES_PutPlayerInVehicle
- #endif
- /*
- * FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
- *
- * FIXES:
- * SetPlayerCheckpoint
- */
- #if defined _ALS_SetPlayerCheckpoint
- #error _ALS_SetPlayerCheckpoint defined
- #endif
- native BAD_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) = SetPlayerCheckpoint;
- #if FIX_SetPlayerCheckpoint
- stock FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
- {
- return
- DisablePlayerCheckpoint(playerid),
- SetPlayerCheckpoint(playerid, x, y, z, size);
- }
-
- #define _ALS_SetPlayerCheckpoint
- #define SetPlayerCheckpoint FIXES_SetPlayerCheckpoint
- #endif
- /*
- * FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
- *
- * FIXES:
- * SetPlayerRaceCheckpoint
- */
- #if defined _ALS_SetPlayerRaceCheckpoint
- #error _ALS_SetPlayerRaceCheckpoint defined
- #endif
- native BAD_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) = SetPlayerRaceCheckpoint;
- #if FIX_SetPlayerRaceCheckpoint
- stock FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
- {
- return
- DisablePlayerRaceCheckpoint(playerid),
- SetPlayerRaceCheckpoint(playerid, type, x, y, z, nextx, nexty, nextz, size);
- }
-
- #define _ALS_SetPlayerRaceCheckpoint
- #define SetPlayerRaceCheckpoint FIXES_SetPlayerRaceCheckpoint
- #endif
- /*
- * _FIXES_HideGameTextForPlayer(playerid, style, parr[])
- *
- * Hides a GameText style for one or more players, and accounts for the fact
- * that they may have different messages being shown.
- *
- * FIXES:
- * GameText
- */
- #if FIX_GameText
- static stock _FIXES_HideGameTextForPlayer(playerid, style, parr[])
- {
- switch (playerid)
- {
- case MAX_PLAYERS:
- {
- // Remove the global GameText for everyone that can see it.
- TextDrawHideForAll(FIXES_gsGTStyle[style]);
- }
- case INVALID_PLAYER_ID:
- {
- // Hide any player-local ones. This is similar to "foreach".
- playerid = parr[MAX_PLAYERS],
- parr[MAX_PLAYERS] = MAX_PLAYERS;
- for (new next; playerid != MAX_PLAYERS; playerid = next)
- {
- PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]),
- next = parr[playerid],
- parr[playerid] = 0;
- }
- }
- default:
- {
- // Remove.
- PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]),
- _FIXES_RemoveInternal(parr, playerid, MAX_PLAYERS);
- }
- }
- }
- #endif
- /*
- * _FIXES_HideGameTextTimer(playerid, style)
- *
- * FIXES:
- * GameText
- */
- #if FIX_GameText
- forward _FIXES_HideGameTextTimer(playerid, style);
-
- public _FIXES_HideGameTextTimer(playerid, style)
- {
- if (GetTickCount() >= FIXES_gsGTTimer[style][playerid])
- {
- // Only hide it if it hasn't been re-shown in the interim.
- _FIXES_HideGameTextForPlayer(playerid, style, FIXES_gsPlayerPGTShown[style]);
- }
- }
- #endif
- /*
- * _FIXES_GameTextShow(playerid, string[], time, style)
- *
- * FIXES:
- * GameText
- */
- #if FIX_GameText
- forward _FIXES_GameTextShow(playerid, string[], time, style);
-
- public _FIXES_GameTextShow(playerid, string[], time, style)
- {
- _FIXES_IS_IN_CHARGE()
- {
- if (playerid == MAX_PLAYERS)
- {
- _FIXES_HideGameTextForPlayer(INVALID_PLAYER_ID, style, FIXES_gsPlayerPGTShown[style]),
- TextDrawSetString(FIXES_gsGTStyle[style], string),
- TextDrawShowForAll(FIXES_gsGTStyle[style]);
- }
- else
- {
- TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[style]),
- PlayerTextDrawSetString(playerid, FIXES_gsPGTStyle[playerid][style], string),
- PlayerTextDrawShow(playerid, FIXES_gsPGTStyle[playerid][style]),
- _FIXES_AddInternal(FIXES_gsPlayerPGTShown[style], playerid, MAX_PLAYERS);
- }
- if (time)
- {
- // Tiny offset because timers are inaccurate.
- FIXES_gsGTTimer[style][playerid] = GetTickCount() + time - 10,
- // Don't need to save the timer's ID.
- SetTimerEx(FIXES_gscHideGameTextTimer, time, false, FIXES_gscSpec@ii, playerid, style);
- }
- }
- return 1;
- }
- #endif
- /*
- * FIXES_GameTextForAll(string[], time, style)
- *
- * FIXES:
- * GameText
- */
- #if defined _ALS_GameTextForAll
- #error _ALS_GameTextForAll defined
- #endif
- native BAD_GameTextForAll(const string[], time, style) = GameTextForAll;
- #if FIX_GameText
- stock FIXES_GameTextForAll(string[], time, style)
- {
- if (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT))
- {
- if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
- {
- #if FIXES_Single
- return _FIXES_GameTextShow(MAX_PLAYERS, FIXES_gscSpace, time, style);
- #else
- return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, FIXES_gscSpace, time, style);
- #endif
- }
- else
- {
- #if FIXES_Single
- return _FIXES_GameTextShow(MAX_PLAYERS, string, time, style);
- #else
- return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, string, time, style);
- #endif
- }
- }
- return 0;
- }
-
- #define _ALS_GameTextForAll
-
- #define GameTextForAll FIXES_GameTextForAll
- #endif
- /*
- * FIXES_GameTextForPlayer(playerid, string[], time, style)
- *
- * FIXES:
- * GameText
- */
- #if defined _ALS_GameTextForPlayer
- #error _ALS_GameTextForPlayer defined
- #endif
- native BAD_GameTextForPlayer(playerid, const string[], time, style) = GameTextForPlayer;
- #if FIX_GameText
- stock FIXES_GameTextForPlayer(playerid, string[], time, style)
- {
- if (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT) && _FIXES_IS_PLAYER_CONNECTED(playerid))
- {
- if ((string[0] <= '\0') || (string[0] == '\1' && string[1] == '\0'))
- {
- #if FIXES_Single
- return _FIXES_GameTextShow(playerid, FIXES_gscSpace, time, style);
- #else
- return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, FIXES_gscSpace, time, style);
- #endif
- }
- else
- {
- #if FIXES_Single
- return _FIXES_GameTextShow(playerid, string, time, style);
- #else
- return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, string, time, style);
- #endif
- }
- }
- return 0;
- }
-
- #define _ALS_GameTextForPlayer
-
- #define GameTextForPlayer FIXES_GameTextForPlayer
- #endif
- /*
- * HideGameTextForAll(style)
- *
- * FIXES:
- * HideGameText
- */
- #if defined _ALS_HideGameTextForAll
- #error _ALS_HideGameTextForAll defined
- #endif
- native BAD_HideGameTextForAll(style) = HideGameTextForAll;
- #if FIX_HideGameText
- #define _ALS_HideGameTextForAll
-
- #define HideGameTextForAll(%0) GameTextForAll(FIXES_gscSpace, 0, (%0))
- #endif
- /*
- * HideGameTextForPlayer(playerid, style)
- *
- * FIXES:
- * HideGameText
- */
- #if defined _ALS_HideGameTextForPlayer
- #error _ALS_HideGameTextForPlayer defined
- #endif
- native BAD_HideGameTextForPlayer(playerid, style) = HideGameTextForPlayer;
- #if FIX_HideGameText
- #define _ALS_HideGameTextForPlayer
-
- #define HideGameTextForPlayer(%1,%0) GameTextForPlayer((%1), FIXES_gscSpace, 0, (%0))
- #endif
- /*
- * PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])
- *
- * FIXES:
- * CreatePlayerTextDraw
- */
- #if defined _ALS_CreatePlayerTextDraw
- #error _ALS_CreatePlayerTextDraw defined
- #endif
- native Text:BAD_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[]) = CreatePlayerTextDraw;
- #if FIX_CreatePlayerTextDraw
- stock PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])
- {
- if ((text[0] == '\0') || (text[0] == '\1' && text[1] == '\0'))
- {
- return CreatePlayerTextDraw(playerid, x, y, FIXES_gscSpace);
- }
- else
- {
- return CreatePlayerTextDraw(playerid, x, y, text);
- }
- }
-
- #define _ALS_CreatePlayerTextDraw
- #define CreatePlayerTextDraw FIXES_CreatePlayerTextDraw
- #endif
- /*
- * FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[])
- *
- * FIXES:
- * PlayerTextDrawSetString
- */
- #if defined _ALS_PlayerTextDrawSetString
- #error _ALS_PlayerTextDrawSetString defined
- #endif
- native BAD_PlayerTextDrawSetString(playerid, PlayerText:text, string[]) = PlayerTextDrawSetString;
- #if FIX_PlayerTextDrawSetString
- stock FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[])
- {
- if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
- {
- return PlayerTextDrawSetString(playerid, text, FIXES_gscSpace);
- }
- else
- {
- return PlayerTextDrawSetString(playerid, text, string);
- }
- }
-
- #define _ALS_PlayerTextDrawSetString
- #define PlayerTextDrawSetString FIXES_PlayerTextDrawSetString
- #endif
- /*
- * Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
- *
- * FIXES:
- * TextDrawCreate
- */
- #if defined _ALS_TextDrawCreate
- #error _ALS_TextDrawCreate defined
- native Text:BAD_TextDrawCreate(Float:x, Float:y, text[]) = TextDrawCreate;
- #if FIX_TextDrawCreate
- stock Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
- {
- if ((text[0] == '\0') || (text[0] == '\1' && text[1] == '\0'))
- {
- return TextDrawCreate(x, y, FIXES_gscSpace);
- }
- else
- {
- return TextDrawCreate(x, y, text);
- }
- }
-
- #endif
- #define _ALS_TextDrawCreate
- #define TextDrawCreate FIXES_TextDrawCreate
- #endif
- /*
- * FIXES_TextDrawSetString(Text:text, string[])
- *
- * FIXES:
- * TextDrawSetString
- */
- #if defined _ALS_TextDrawSetString
- #error _ALS_TextDrawSetString defined
- #endif
- native BAD_TextDrawSetString(Text:text, string[]) = TextDrawSetString;
- #if FIX_TextDrawSetString
- stock FIXES_TextDrawSetString(Text:text, string[])
- {
- if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
- {
- return TextDrawSetString(text, FIXES_gscSpace);
- }
- else
- {
- return TextDrawSetString(text, string);
- }
- }
-
- #define _ALS_TextDrawSetString
- #define TextDrawSetString FIXES_TextDrawSetString
- #endif
- /*
- * FIXES_AllowInteriorWeapons(allow)
- *
- * FIXES:
- * AllowInteriorWeapons
- */
- #if defined _ALS_AllowInteriorWeapons
- #error _ALS_AllowInteriorWeapons defined
- #endif
- native BAD_AllowInteriorWeapons(allow) = AllowInteriorWeapons;
- #if FIX_AllowInteriorWeapons
- #if FIXES_Single
- stock FIXES_AllowInteriorWeapons(allow)
- {
- if (allow)
- {
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
- _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
- {
- FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR;
- }
- }
- else
- {
- FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;
- _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
- {
- if (GetPlayerInterior(i))
- {
- FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR;
- }
- }
- }
- return allow;
- }
- #else
- forward _FIXES_AllowInteriorWeapons(allow);
-
- stock FIXES_AllowInteriorWeapons(allow)
- {
- CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, allow);
- return allow;
- }
-
- public _FIXES_AllowInteriorWeapons(allow)
- {
- if (allow)
- {
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
- _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
- {
- FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR;
- }
- }
- else
- {
- FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;
- _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
- {
- if (GetPlayerInterior(i))
- {
- FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR;
- }
- }
- }
- return allow;
- }
- #endif
-
- #define _ALS_AllowInteriorWeapons
- #define AllowInteriorWeapons FIXES_AllowInteriorWeapons
- #endif
- /*
- * FIXES_GetPlayerInterior(playerid)
- *
- * FIXES:
- * GetPlayerInterior
- */
- #if defined _ALS_GetPlayerInterior
- #error _ALS_GetPlayerInterior defined
- #endif
- native BAD_GetPlayerInterior(playerid) = GetPlayerInterior;
- #if FIX_GetPlayerInterior
- stock FIXES_GetPlayerInterior(playerid)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- #if FIXES_Single
- return FIXES_gsInterior[playerid];
- #else
- return GetPVarInt(playerid, FIXES_pvarPlayerInterior);
- #endif
- }
- return 0;
- }
-
- #define _ALS_GetPlayerInterior
- #define GetPlayerInterior FIXES_GetPlayerInterior
- #endif
- /*
- * FIXES_SetPlayerInterior(playerid, interiorid)
- *
- * FIXES:
- * GetPlayerInterior
- */
- #if defined _ALS_SetPlayerInterior
- #error _ALS_SetPlayerInterior defined
- #endif
- native BAD_SetPlayerInterior(playerid, interiorid) = SetPlayerInterior;
- #if FIX_GetPlayerInterior
- stock FIXES_SetPlayerInterior(playerid, interiorid)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- #if FIXES_Single
- FIXES_gsInterior[playerid] = interiorid;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerInterior, interiorid);
- #endif
- return SetPlayerInterior(playerid, interiorid);
- }
- return 0;
- }
-
- #define _ALS_SetPlayerInterior
- #define SetPlayerInterior FIXES_SetPlayerInterior
- #endif
- /*
- * OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
- *
- * FIXES:
- * AllowTeleport
- */
- #if FIX_AllowTeleport && !defined FILTERSCRIPT
- forward _FIXES_AllowTeleport(playerid, allow);
-
- public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
- {
- // ======================
- // BEGIN: AllowTeleport
- // ======================
- #if FIX_AllowTeleport
- if (!_FIXES_gIsFilterscript)
- {
- // Unusually, the call order here is always Game Mode first -
- // most callbacks are Filter Script first.
- if ((FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_TELEPORT) || ((FIXES_gsSettings & e_FIXES_SETTINGS_ADMIN_TELEPORT) && (IsPlayerAdmin(playerid))))
- {
- SetPlayerPosFindZ(playerid, fX, fY, fZ);
- }
- }
- #endif
- // ======================
- // END: AllowTeleport
- // ======================
- return FIXES_OnPlayerClickMap(playerid, fX, fY, fZ);
- }
-
- #if defined _ALS_OnPlayerClickMap
- #error _ALS_OnPlayerClickMap defined
- #endif
- #define _ALS_OnPlayerClickMap
- #define OnPlayerClickMap(%0) FIXES_OnPlayerClickMap(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ);
- #endif
- /*
- * FIXES_AllowPlayerTeleport(playerid, allow)
- *
- * FIXES:
- * AllowTeleport
- */
- #if defined _ALS_AllowPlayerTeleport
- #error _ALS_AllowPlayerTeleport defined
- #endif
- native BAD_AllowPlayerTeleport(playerid, allow) = AllowPlayerTeleport;
- #if FIX_AllowTeleport
- #if FIXES_Single
- stock FIXES_AllowPlayerTeleport(playerid, allow)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- if (allow)
- {
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;
- }
- else
- {
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;
- }
- }
- return 0;
- }
- #else
- stock FIXES_AllowPlayerTeleport(playerid, allow)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, playerid, allow);
- }
- return 0;
- }
- #endif
-
- #define _ALS_AllowPlayerTeleport
- #define AllowPlayerTeleport FIXES_AllowPlayerTeleport
- #endif
- /*
- * FIXES_AllowAdminTeleport(allow)
- *
- * FIXES:
- * AllowTeleport
- */
- #if defined _ALS_AllowAdminTeleport
- #error _ALS_AllowAdminTeleport defined
- #endif
- native BAD_AllowAdminTeleport(allow) = AllowAdminTeleport;
- #if FIX_AllowTeleport
- #if FIXES_Single
- stock FIXES_AllowAdminTeleport(allow)
- {
- if (allow)
- {
- FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;
- }
- else
- {
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
- }
- return allow;
- }
- #else
- stock FIXES_AllowAdminTeleport(allow)
- {
- return
- CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, INVALID_PLAYER_ID, allow),
- allow;
- }
- #endif
-
- #define _ALS_AllowAdminTeleport
- #define AllowAdminTeleport FIXES_AllowAdminTeleport
- #endif
- /*
- * FIXES_AllowAdminTeleport(allow)
- *
- * FIXES:
- * AllowTeleport
- */
- #if FIX_AllowTeleport && !defined FILTERSCRIPT && !FIXES_Single
- public _FIXES_AllowTeleport(playerid, allow)
- {
- if (!_FIXES_gIsFilterscript)
- {
- if (playerid == INVALID_PLAYER_ID)
- {
- if (allow)
- {
- FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;
- }
- else
- {
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
- }
- }
- else
- {
- if (allow)
- {
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;
- }
- else
- {
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;
- }
- }
- }
- }
- #endif
- /*
- * FIXES_SetPlayerSpecialAction(playerid, actionid)
- *
- * FIXES:
- * SetPlayerSpecialAction
- */
- #if defined _ALS_SetPlayerSpecialAction
- #error _ALS_SetPlayerSpecialAction defined
- #endif
- native BAD_SetPlayerSpecialAction(playerid, actionid) = SetPlayerSpecialAction;
- #if FIX_SetPlayerSpecialAction
- stock FIXES_SetPlayerSpecialAction(playerid, actionid)
- {
- if (GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)
- {
- ClearAnimations(playerid);
- }
- SetPlayerSpecialAction(playerid, actionid);
- return 1;
- }
-
- #define _ALS_SetPlayerSpecialAction
- #define SetPlayerSpecialAction FIXES_SetPlayerSpecialAction
- #endif
- /*
- * FIXES_ClearAnimations(playerid, forcesync = 0)
- *
- * FIXES:
- * ClearAnimations
- */
- #if defined _ALS_ClearAnimations
- #error _ALS_ClearAnimations defined
- #endif
- native BAD_ClearAnimations(playerid, forcesync = 0) = ClearAnimations;
- #if FIX_ClearAnimations || FIX_ClearAnimations_2
- stock FIXES_ClearAnimations(playerid, forcesync = 0)
- {
- #if FIX_ClearAnimations || FIX_ClearAnimations_2
- if (IsPlayerInAnyVehicle(playerid))
- #endif
- #if FIX_ClearAnimations
- {
- return ApplyAnimation(playerid, "PED", "CAR_SIT", 4.0, 0, 0, 0, 0, 1, forcesync);
- }
- #endif
- #if FIX_ClearAnimations + FIX_ClearAnimations_2 == 1 // XOR
- {
- return ClearAnimations(playerid, forcesync);
- }
- #endif
- #if FIX_ClearAnimations_2
- new
- ret = ClearAnimations(playerid, forcesync);
- ApplyAnimation(playerid, "PED", "IDLE_STANCE", 4.0, 0, 0, 0, 0, 1, forcesync);
- ApplyAnimation(playerid, "PED", "IDLE_CHAT", 4.0, 0, 0, 0, 0, 1, forcesync);
- ApplyAnimation(playerid, "PED", "WALK_PLAYER", 4.0, 0, 0, 0, 0, 1, forcesync);
- return ret;
- #endif
- }
-
- #define _ALS_ClearAnimations
- #define ClearAnimations FIXES_ClearAnimations
- #endif
- /*
- * FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy)
- *
- * FIXES:
- * GangZoneCreate
- */
- #if defined _ALS_GangZoneCreate
- #error _ALS_GangZoneCreate defined
- #endif
- native BAD_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy) = GangZoneCreate;
- #if FIX_GangZoneCreate
- stock FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy)
- {
- return GangZoneCreate(floatsub(minx, floatfract(minx)), floatsub(miny, floatfract(miny)), floatsub(maxx, floatfract(maxx)), floatsub(maxy, floatfract(maxy)));
- }
-
- #define _ALS_GangZoneCreate
- #define GangZoneCreate FIXES_GangZoneCreate
- #endif
- /*
- * FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])
- *
- * FIXES:
- * OnDialogResponse
- * GetPlayerDialog
- */
- #if defined _ALS_ShowPlayerDialog
- #error _ALS_ShowPlayerDialog defined
- #endif
- native BAD_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) = ShowPlayerDialog;
- #if FIX_OnDialogResponse || FIX_GetPlayerDialog
- stock FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- #if FIXES_Single
- FIXES_gsDialogID[playerid] = dialog;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerDialog, dialog);
- #endif
- return ShowPlayerDialog(playerid, dialog, style, title, caption, button1, button2);
- }
- return 0;
- }
-
- #define _ALS_ShowPlayerDialog
- #define ShowPlayerDialog FIXES_ShowPlayerDialog
- #endif
- /*
- * OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
- *
- * FIXES:
- * OnDialogResponse
- * GetPlayerDialog
- */
- #if FIX_OnDialogResponse || FIX_GetPlayerDialog
- public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
- {
- // =========================
- // BEGIN: OnDialogResponse
- // =========================
- #if FIX_OnDialogResponse || FIX_GetPlayerDialog
- #if FIXES_Single
- #if FIX_OnDialogResponse
- dialogid = FIXES_gsDialogID[playerid];
- #endif
- FIXES_gsDialogID[playerid] = INVALID_DIALOG_ID;
- #elseif FIX_OnDialogResponse
- _FIXES_IS_IN_CHARGE()
- {
- // If there are multiple scripts, we can't just wipe the
- // current dialog data or subsequent scripts will display
- // the wrong value.
- dialogid = GetPVarInt(playerid, FIXES_pvarPlayerDialog),
- SetPVarInt(playerid, FIXES_pvarCurrentDialog, dialogid),
- SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
- }
- else
- {
- dialogid = GetPVarInt(playerid, FIXES_pvarCurrentDialog);
- }
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
- #endif
- if (inputtext[0])
- {
- return FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext);
- }
- else
- {
- return FIXES_OnDialogResponse(playerid, dialogid, response, listitem, FIXES_gscNULL);
- }
- #endif
- // =========================
- // END: OnDialogResponse
- // =========================
- }
-
- #if defined _ALS_OnDialogResponse
- #error _ALS_OnDialogResponse defined
- #endif
- #define _ALS_OnDialogResponse
- #define OnDialogResponse(%0) FIXES_OnDialogResponse(%0) <_ALS : _ALS_go>
-
- _FIXES_FORWARD FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
- #endif
- /*
- * FIXES_GetPlayerDialog(playerid)
- *
- * FIXES:
- * GetPlayerDialog
- */
- #if defined _ALS_GetPlayerDialog
- #error _ALS_GetPlayerDialog defined
- #endif
- native BAD_GetPlayerDialog(playerid) = GetPlayerDialog;
- #if FIX_GetPlayerDialog
- stock FIXES_GetPlayerDialog(playerid)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- #if FIXES_Single
- return FIXES_gsDialogID[playerid];
- #else
- return GetPVarInt(playerid, FIXES_pvarPlayerDialog);
- #endif
- }
- return -1;
- }
-
- #define _ALS_GetPlayerDialog
- #define GetPlayerDialog FIXES_GetPlayerDialog
- #endif
- /*
- * FIXES_valstr(dest[], value, bool:pack = false)
- *
- * FIXES:
- * valstr
- */
- #if defined _ALS_valstr
- #error _ALS_valstr defined
- #endif
- native BAD_valstr(dest[], value, bool:pack = false) = valstr;
- #if FIX_valstr
- stock FIXES_valstr(dest[], value, bool:pack = false)
- {
- // "format" can't handle cellmin properly.
- static const
- sc_szCellmin[] = !"-2147483648";
- if (value == cellmin)
- {
- pack && strpack(dest, sc_szCellmin, 12) || strunpack(dest, sc_szCellmin, 12);
- }
- else
- {
- format(dest, 12, "%d", value),
- pack && strpack(dest, dest, 12);
- }
- return 0;
- }
-
- #define _ALS_valstr
- #define valstr FIXES_valstr
- #endif
- /*
- * FIXES_fclose(File:handle)
- *
- * FIXES:
- * fclose
- */
- #if defined _ALS_fclose
- #error _ALS_fclose defined
- #endif
- native BAD_fclose(File:handle) = fclose;
- #if FIX_fclose
- stock bool:FIXES_fclose(File:handle)
- {
- return handle && fclose(handle);
- }
-
- #define _ALS_fclose
- #define fclose FIXES_fclose
- #endif
- /*
- * FIXES_fwrite(File:handle, const string[])
- *
- * FIXES:
- * fwrite
- */
- #if defined _ALS_fwrite
- #error _ALS_fwrite defined
- #endif
- native BAD_fwrite(File:handle, const string[]) = fwrite;
- #if FIX_fwrite
- stock FIXES_fwrite(File:handle, const string[])
- {
- return handle && fwrite(handle, string);
- }
-
- #define _ALS_fwrite
- #define fwrite FIXES_fwrite
- #endif
- /*
- * FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
- *
- * FIXES:
- * fread
- */
- #if defined _ALS_fread
- #error _ALS_fread defined
- #endif
- native BAD_fread(File:handle, string[], size = sizeof (string), bool:pack = false) = fread;
- #if FIX_fread
- stock FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
- {
- return handle && fread(handle, string, size, pack);
- }
-
- #define _ALS_fread
- #define fread FIXES_fread
- #endif
- /*
- * FIXES_fputchar(File:handle, value, bool:utf8 = true)
- *
- * FIXES:
- * fputchar
- */
- #if defined _ALS_fputchar
- #error _ALS_fputchar defined
- #endif
- native BAD_fputchar(File:handle, value, bool:utf8 = true) = fputchar;
- #if FIX_fputchar
- stock bool:FIXES_fputchar(File:handle, value, bool:utf8 = true)
- {
- return handle && fputchar(handle, value, utf8);
- }
-
- #define _ALS_fputchar
- #define fputchar FIXES_fputchar
- #endif
- /*
- * FIXES_fgetchar(File:handle, value, bool:utf8 = true)
- *
- * FIXES:
- * fgetchar
- */
- #if defined _ALS_fgetchar
- #error _ALS_fgetchar defined
- #endif
- native BAD_fgetchar(File:handle, value, bool:utf8 = true) = fgetchar;
- #if FIX_fgetchar
- stock FIXES_fgetchar(File:handle, value, bool:utf8 = true)
- {
- return handle && fgetchar(handle, value, utf8);
- }
-
- #define _ALS_fgetchar
- #define fgetchar FIXES_fgetchar
- #endif
- /*
- * FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
- *
- * FIXES:
- * fblockwrite
- */
- #if defined _ALS_fblockwrite
- #error _ALS_fblockwrite defined
- #endif
- native BAD_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) = fblockwrite;
- #if FIX_fblockwrite
- stock FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
- {
- return handle && fblockwrite(handle, buffer, size);
- }
-
- #define _ALS_fblockwrite
- #define fblockwrite FIXES_fblockwrite
- #endif
- /*
- * FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
- *
- * FIXES:
- * fblockread
- */
- #if defined _ALS_fblockread
- #error _ALS_fblockread defined
- #endif
- native BAD_fblockread(File:handle, buffer[], size = sizeof (buffer)) = fblockread;
- #if FIX_fblockread
- stock FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
- {
- return handle && fblockread(handle, buffer, size);
- }
-
- #define _ALS_fblockread
- #define fblockread FIXES_fblockread
- #endif
- /*
- * FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
- *
- * FIXES:
- * fseek
- */
- #if defined _ALS_fseek
- #error _ALS_fseek defined
- #endif
- native BAD_fseek(File:handle, position = 0, seek_whence:whence = seek_start) = fseek;
- #if FIX_fseek
- stock FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
- {
- return handle && fseek(handle, position, whence);
- }
-
- #define _ALS_fseek
- #define fseek FIXES_fseek
- #endif
- /*
- * FIXES_flength(File:handle)
- *
- * FIXES:
- * flength
- */
- #if defined _ALS_flength
- #error _ALS_flength defined
- #endif
- native BAD_flength(File:handle) = flength;
- #if FIX_flength
- stock FIXES_flength(File:handle)
- {
- return handle && flength(handle);
- }
-
- #define _ALS_flength
- #define flength FIXES_flength
- #endif
- /*
- * FIXES_Kick(playerid)
- *
- * FIXES:
- * Kick
- */
- #if defined _ALS_Kick
- #error _ALS_Kick defined
- #endif
- native BAD_Kick(playerid) = Kick;
- #if FIX_Kick
- forward _FIXES_Kick(playerid);
-
- public _FIXES_Kick(playerid)
- {
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_KICKED,
- Kick(playerid);
- }
-
- #if !FIXES_Single
- forward @FIXES_Kick(playerid);
-
- public @FIXES_Kick(playerid)
- {
- FIXES_BlockUpdate(playerid, true, 0);
- }
- #endif
-
- stock FIXES_Kick(playerid)
- {
- if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
- {
- // Disable as much of the server as possible quickly.
- return
- #if FIXES_Single
- FIXES_BlockUpdate(playerid, true, 0),
- #else
- CallRemoteFunction("@FIXES_Kick", "i", playerid),
- #endif
- TogglePlayerSpectating(playerid, true),
- TogglePlayerControllable(playerid, false),
- SetPVarInt(playerid, FIXES_pvarKick, SetTimerEx(FIXES_gscKick, 1000, 0, FIXES_gscSpec@i, playerid)),
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_KICKED,
- 1;
- }
- else
- {
- return Kick(playerid);
- }
- }
-
- #define _ALS_Kick
- #define Kick FIXES_Kick
- #endif
- /*
- * FIXES_IsPAttachedObjectSlotUsed(playerid, index)
- *
- * FIXES:
- * IsPlayerAttachedObjectSlotUsed
- */
- #if defined _ALS_IsPAttachedObjSlotUsed
- #error _ALS_IsPAttachedObjSlotUsed defined
- #endif
- native BAD_IsPlayerAttachedObjSlotUsed(playerid, index) = IsPlayerAttachedObjectSlotUsed;
- #if FIX_IsPlayerAttachedObjSlotUsed
- stock FIXES_IsPAttachedObjectSlotUsed(playerid, index)
- {
- if (_FIXES_IS_PLAYER_CONNECTED(playerid))
- {
- return FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] & 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index;
- }
- return 0;
- }
-
- #define _ALS_IsPAttachedObjSlotUsed
- #define IsPlayerAttachedObjectSlotUsed FIXES_IsPAttachedObjectSlotUsed
- #endif
- /*
- * _FIXES_SetPlayerAttachedObject(slot, to)
- *
- * FIXES:
- * IsPlayerAttachedObjectSlotUsed
- */
- #if (FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject) && !FIXES_Single
- forward _FIXES_SetPlayerAttachedObject(slot, to);
-
- public _FIXES_SetPlayerAttachedObject(slot, to)
- {
- FIXES_gsObjectSlots[slot] = to;
- }
- #endif
- /*
- * FIXES_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0)
- *
- * FIXES:
- * IsPlayerAttachedObjectSlotUsed
- * SetPlayerAttachedObject
- */
- #if defined _ALS_SetPlayerAttachedObject
- #error _ALS_SetPlayerAttachedObject defined
- #endif
- native BAD_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0, materialcolor1 = 0, materialcolor2 = 0) = SetPlayerAttachedObject;
- #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
- stock FIXES_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0, materialcolor1 = 0, materialcolor2 = 0)
- {
- if (SetPlayerAttachedObject(playerid, index, modelid, bone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ, materialcolor1, materialcolor2))
- {
- #if FIXES_Single
- FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] |= (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index);
- #else
- new
- slot = playerid / _FIXES_ATTACHMENTS;
- CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] | (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));
- #endif
- return 1;
- }
- return 0;
- }
-
- #define _ALS_SetPlayerAttachedObject
- #define SetPlayerAttachedObject FIXES_SetPlayerAttachedObject
- #endif
- /*
- * FIXES_RemovePlayerAttachedObj(playerid, index)
- *
- * FIXES:
- * IsPlayerAttachedObjectSlotUsed
- */
- #if defined _ALS_RemovePlayerAttachedObject
- #error _ALS_RemovePlayerAttachedObject defined
- #endif
- native BAD_RemovePlayerAttachedObject(playerid, index) = RemovePlayerAttachedObject;
- #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
- stock FIXES_RemovePlayerAttachedObj(playerid, index)
- {
- if (RemovePlayerAttachedObject(playerid, index))
- {
- #if FIXES_Single
- FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index);
- #else
- new
- slot = playerid / _FIXES_ATTACHMENTS;
- CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] & ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));
- #endif
- return 1;
- }
- return 0;
- }
-
- #define _ALS_RemovePlayerAttachedObject
- #define RemovePlayerAttachedObject FIXES_RemovePlayerAttachedObj
- #endif
- /*
- * _FIXES_DetermineOrder()
- *
- * Figure out which the first filterscript to be called is so that it can do the
- * majority of the work. More detail: Several pieces of code for some fixes
- * rely on things like blocking "OnPlayerUpdate". This should be done in the
- * first script in which "OnPlayerUpdate" is called only, so we need to find out
- * in advance which script will be called first (at least out of all the fixed
- * scripts).
- */
- #if !FIXES_Single
- public _FIXES_DetermineOrder()
- {
- // TODO: Graceful handoff. I thought I was past all this rubbish!
- if (!_FIXES_gIsFilterscript)
- {
- if (existproperty(5, FIXES_gscNoGMProperty))
- {
- return 0;
- }
- // Make sure certain data is synced with what the GM thinks it is.
- // =============================
- // BEGIN: AllowInteriorWeapons
- // =============================
- #if FIX_AllowInteriorWeapons
- CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, !(FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR));
- #endif
- // =============================
- // END: AllowInteriorWeapons
- // =============================
-
- // ================================
- // BEGIN: SetPlayerAttachedObject
- // ================================
- #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
- for (new i = 0; i != _FIXES_ATTACHMENTS; ++i)
- {
- CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, i, FIXES_gsObjectSlots[i]);
- }
- #endif
- // ==============================
- // END: SetPlayerAttachedObject
- // ==============================
- }
- if (existproperty(5, FIXES_gscOrderProperty))
- {
- // Either this is a Filter Script (1) and we don't want gamemodes
- // (1) or this isn't a filterscript (0) and we do want gamemodes
- // (0). All other cases return here due to a logic mismatch. This
- // is to rectify the difference in call orders between
- // "CallRemoteFunction" and normal callbacks. Now DOESN'T end on
- // the second time round for filterscripts to correctly pass on the
- // data to GameModes.
- if (!existproperty(5, FIXES_gscNoGMProperty) && _FIXES_gIsFilterscript == bool:getproperty(5, FIXES_gscOrderProperty))
- {
- // The game mode is not in charge, which means we are checking
- // the filterscripts a second time and shouldn't be.
- return 0;
- }
- // If this script was previously the owner, and we are not ending
- // the game mode (in which case discard all data), and if we are
- // only dealing with filterscripts or the gamemode is now the
- // master.
- if (FIXES_gsSettings & (e_FIXES_SETTINGS_IN_CHARGE | e_FIXES_SETTINGS_DROP_ALL_DATA) == e_FIXES_SETTINGS_IN_CHARGE)
- {
- FIXES_PRINTF("_FIXES_DetermineOrder: Was in charge");
- // This script is currently in charge, but a new script has
- // usurped it! Pass all relevant data over to the new script.
- // Also, this wasn't triggered by a game mode change (where we
- // just want to dump and reset all data). There is no need to
- // reset the admin teleport data as that is always handled by
- // the Game Mode, so it will either be correct, or it will be
- // blank.
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;
- #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
- _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
- {
- // =================
- // BEGIN: GameText
- // =================
- #if FIX_GameText
- for (new j = 0; j != FIXES_GT_STYLE_COUNT; ++j)
- {
- PlayerTextDrawDestroy(i, FIXES_gsPGTStyle[i][j]);
- }
- #endif
- // =================
- // END: GameText
- // =================
-
- // =============================
- // BEGIN: SetPlayerWorldBounds
- // =============================
- #if FIX_SetPlayerWorldBounds
- // I realised that you could have the GM in charge,
- // set their bounds, load an FS, remove their bounds
- // then unload the FS again and it would result in
- // the old GM setting of them HAVING bounds being
- // re-applied, so the check is removed.
- CallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@iffff, i, FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_UX], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_LX], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_UY], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_LY]);
- #endif
- // =============================
- // END: SetPlayerWorldBounds
- // =============================
-
- // =================================
- // BEGIN: TogglePlayerControllable
- // =================================
- #if FIX_TogglePlayerControllable
- CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, i, !(FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_UNCONTROLLABLE));
- #endif
- // =================================
- // END: TogglePlayerControllable
- // =================================
-
- // ===========================
- // BEGIN: PutPlayerInVehicle
- // ===========================
- #if FIX_PutPlayerInVehicle
- if (FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_PUT_IN_VEHICLE)
- {
- CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iii, i, FIXES_gsVehicleSeatData[i] & 0x00FFFFFF, FIXES_gsVehicleSeatData[i] >>> 24);
- }
- #endif
- // ===========================
- // END: PutPlayerInVehicle
- // ===========================
- }
- #endif
-
- // =================
- // BEGIN: GameText
- // =================
- #if FIX_GameText
- #if FIX_GameTextStyles
- TextDrawDestroy(FIXES_gsGTStyle[13]),
- TextDrawDestroy(FIXES_gsGTStyle[12]),
- TextDrawDestroy(FIXES_gsGTStyle[11]),
- TextDrawDestroy(FIXES_gsGTStyle[10]),
- TextDrawDestroy(FIXES_gsGTStyle[9]),
- TextDrawDestroy(FIXES_gsGTStyle[8]),
- TextDrawDestroy(FIXES_gsGTStyle[7]),
- #endif
- TextDrawDestroy(FIXES_gsGTStyle[6]),
- TextDrawDestroy(FIXES_gsGTStyle[5]),
- TextDrawDestroy(FIXES_gsGTStyle[4]),
- TextDrawDestroy(FIXES_gsGTStyle[3]),
- TextDrawDestroy(FIXES_gsGTStyle[2]),
- TextDrawDestroy(FIXES_gsGTStyle[1]),
- TextDrawDestroy(FIXES_gsGTStyle[0]);
- #endif
- // =================
- // END: GameText
- // =================
-
- FIXES_PRINTF("_FIXES_DetermineOrder: Not in charge");
- return 0;
- }
- else
- {
- FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;
- FIXES_PRINTF("_FIXES_DetermineOrder: Not in charge");
- return 0;
- }
- }
- else if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDING))
- {
- setproperty(5, FIXES_gscOrderProperty, _FIXES_gIsFilterscript);
- #if FIXES_Debug
- if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
- {
- FIXES_PRINTF("_FIXES_DetermineOrder: Already in charge");
- }
- #endif
- FIXES_gsSettings |= e_FIXES_SETTINGS_IN_CHARGE;
- FIXES_PRINTF("_FIXES_DetermineOrder: Now in charge");
-
- // =================
- // BEGIN: GameText
- // =================
- #if FIX_GameText
- // Create all the relevant TextDraws.
- _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
- {
- _FIXES_CreateGameTextDraws(playerid);
- }
- _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
- #endif
- // =================
- // END: GameText
- // =================
- return 1;
- }
- else if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDED))
- {
- // Only called when a filterscript that is currently master (and
- // thus called first by "CallRemoteFunction") ends. This doesn't
- // get triggered when a gamemode is master, but that doesn't matter
- // because in that case all the textdraws are destroyed anyway.
-
- // =================
- // BEGIN: GameText
- // =================
- #if FIX_GameText
- // Destroy all the relevant TextDraws.
- _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
- {
- #if FIX_GameTextStyles
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
- #endif
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
- PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
- }
- #if FIX_GameTextStyles
- TextDrawDestroy(FIXES_gsGTStyle[13]),
- TextDrawDestroy(FIXES_gsGTStyle[12]),
- TextDrawDestroy(FIXES_gsGTStyle[11]),
- TextDrawDestroy(FIXES_gsGTStyle[10]),
- TextDrawDestroy(FIXES_gsGTStyle[9]),
- TextDrawDestroy(FIXES_gsGTStyle[8]),
- TextDrawDestroy(FIXES_gsGTStyle[7]),
- #endif
- TextDrawDestroy(FIXES_gsGTStyle[6]),
- TextDrawDestroy(FIXES_gsGTStyle[5]),
- TextDrawDestroy(FIXES_gsGTStyle[4]),
- TextDrawDestroy(FIXES_gsGTStyle[3]),
- TextDrawDestroy(FIXES_gsGTStyle[2]),
- TextDrawDestroy(FIXES_gsGTStyle[1]),
- TextDrawDestroy(FIXES_gsGTStyle[0]);
- #endif
- // =================
- // END: GameText
- // =================
-
- #if FIXES_Debug
- FIXES_PRINTF("_FIXES_DetermineOrder: Ending");
- #endif
-
- FIXES_gsSettings |= e_FIXES_SETTINGS_ENDED;
- }
- return 0;
- }
- #endif
- /*
- * FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)
- *
- * FIXES:
- * strins
- */
- #if defined _ALS_strins
- #error _ALS_strins defined
- #endif
- native BAD_strins(string[], const substr[], pos, maxlength = sizeof string) = strins;
- #if FIX_strins
- stock FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)
- {
- if (string[0] > 255)
- {
- new
- strlength = strlen(string),
- sublength = strlen(substr),
- m4 = maxlength * 4;
- // Packed - format doesn't like these strings.
- if (strlength + sublength >= m4)
- {
- if (pos + sublength >= m4)
- {
- return
- string{pos} = '\0',
- // Hopefully this doesn't ignore maxlength and does packed.
- strcat(string, substr, maxlength);
- }
- else
- {
- // pos + sublength is less than maxlength, so this sum MUST
- // be positive and gte than "pos", so there's no need for
- // additional checks.
- string{maxlength - sublength - 1} = '\0';
- }
- }
- return strins(string, substr, pos, maxlength);
- }
- else if (substr[0] > 255)
- {
- new
- strlength = strlen(string),
- sublength = strlen(substr);
- // Packed - format doesn't like these strings.
- if (strlength + sublength >= maxlength)
- {
- if (pos + sublength >= maxlength)
- {
- return
- string[pos] = '\0',
- // Hopefully this doesn't ignore maxlength and does packed.
- strcat(string, substr, maxlength);
- }
- else
- {
- // pos + sublength is less than maxlength, so this sum MUST
- // be positive and gte than "pos", so there's no need for
- // additional checks.
- string[maxlength - sublength - 1] = '\0';
- }
- }
- return strins(string, substr, pos, maxlength);
- }
- else
- {
- return format(string, maxlength, "%.*s%s%s", pos, string, substr, string[pos]);
- }
- }
-
- #define _ALS_strins
- #define strins FIXES_strins
- #endif
- /*
- * _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync)
- *
- * FIXES:
- * ApplyAnimation_2
- */
- #if FIX_ApplyAnimation_2
- forward _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync);
-
- public _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync)
- {
- ApplyAnimation(playerid, FIXES_gscAnimLib[animlib], FIXES_gsClassAnimName[playerid], fDelta, loop, lockx, locky, freeze, time, forcesync),
- FIXES_gsAnimTimer[playerid] = 0;
- }
- #endif
- /*
- * FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)
- *
- * FIXES:
- * ApplyAnimation
- * ApplyAnimation_2
- */
- #if defined _ALS_ApplyAnimation
- #error _ALS_ApplyAnimation defined
- #endif
- native BAD_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0) = ApplyAnimation;
- #if FIX_ApplyAnimation || FIX_ApplyAnimation_2
- stock FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)
- {
- new
- diff,
- idx = animlib[0] & ~0x20;
- // Uses a sort of optimised binary search. The code first identifies the area in the array
- // in which libraries with this first letter are, then does a binary search using only that
- // subset of the array. This used to use an N-ary search that just went linearly through
- // the identified subset of the array, and that was 5x faster than a simple linear loop over
- // the whole array. This new version is 50% faster than even that was. "E" has no
- // libraries, but we don't check for that explicitly as it would slow down the more common
- // code path - and it ends fairly quickly anyway as "upper == lower".
- if (_FIXES_IN_RANGE(idx, 'A', 'W' + 1))
- {
- new
- upper = FIXES_gscAnimIndexes[idx - ('A' - 1)],
- lower = FIXES_gscAnimIndexes[idx - 'A'];
- while (upper != lower)
- {
- idx = (upper - lower) / 2 + lower;
- if ((diff = strcmp(FIXES_gscAnimLib[idx], animlib, true)))
- {
- if (diff > 0) upper = idx;
- else lower = idx + 1;
- }
- else
- {
- // If we hit the "else" branch, we have found the correct
- // animation library from the n-ary search.
- #if FIX_ApplyAnimation_2
- if (FIXES_gsAnimTimer[playerid])
- {
- KillTimer(FIXES_gsAnimTimer[playerid]),
- FIXES_gsAnimTimer[playerid] = 0;
- }
- if (FIXES_gsPlayerAnimLibs[playerid][idx >>> 5] & (1 << (idx & 0x1F)))
- {
- FIXES_gsPlayerAnimLibs[playerid][idx >>> 5] &= ~(1 << (idx & 0x1F)),
- FIXES_gsClassAnimName[playerid][0] = '\0',
- strcat(FIXES_gsClassAnimName[playerid], animname),
- FIXES_gsAnimTimer[playerid] = SetTimerEx("_FIXES_ApplyAnimation", 350, false, "ddfdddddd", playerid, idx, fDelta, loop, lockx, locky, freeze, time, forcesync);
- }
- #endif
- return ApplyAnimation(playerid, animlib, animname, fDelta, loop, lockx, locky, freeze, time, forcesync);
- }
- }
- }
- return 0;
- }
-
- #define _ALS_ApplyAnimation
- #define ApplyAnimation FIXES_ApplyAnimation
- #endif
- /*
- * FIXES_random(max)
- *
- * FIXES:
- * random
- */
- #if defined _ALS_random
- #error _ALS_random defined
- #endif
- native BAD_random(max) = random;
- #if FIX_random
- stock FIXES_random(max)
- {
- if (max < 0)
- {
- return -random(-max);
- }
- else
- {
- return random(max);
- }
- }
-
- #define _ALS_random
- #define random FIXES_random
- #endif
- /*
- * _FIXES_SetCamera
- *
- * FIXES:
- * SetPlayerCamera
- */
- #if FIX_SetPlayerCamera
- forward _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z);
- public _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z)
- {
- if (type)
- {
- SetPlayerCameraPos(playerid, x, y, z);
- }
- else
- {
- SetPlayerCameraLookAt(playerid, x, y, z);
- }
- return 0;
- }
- #endif
- /*
- * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
- *
- * FIXES:
- * SetPlayerCamera
- */
- #if defined _ALS_SetPlayerCameraPos
- #error _ALS_SetPlayerCameraPos defined
- #endif
- native BAD_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraPos;
- #if FIX_SetPlayerCamera
- stock FIXES_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- #if FIXES_Single
- if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
- #else
- if (GetPVarInt(playerid, pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
- #endif
- {
- SetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 1, x, y, z);
- }
- else
- {
- SetPlayerCameraPos(playerid, x, y, z);
- }
- }
- return 0;
- }
-
- #define _ALS_SetPlayerCameraPos
- #define SetPlayerCameraPos FIXES_SetPlayerCameraPos
- #endif
- /*
- * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
- *
- * FIXES:
- * SetPlayerCamera
- */
- #if defined _ALS_SetPlayerCameraLookAt
- #error _ALS_SetPlayerCameraLookAt defined
- #endif
- native BAD_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraLookAt;
- #if FIX_SetPlayerCamera
- stock FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- #if FIXES_Single
- if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
- #else
- if (GetPVarInt(playerid, pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
- #endif
- {
- SetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 2, x, y, z);
- }
- else
- {
- SetPlayerCameraLookAt(playerid, x, y, z);
- }
- }
- return 0;
- }
-
- #define _ALS_SetPlayerCameraLookAt
- #define SetPlayerCameraLookAt FIXES_SetPlayerCameraLookAt
- #endif
- /*
- * FIXES_TogglePlayerSpectating(playerid, toggle)
- *
- * FIXES:
- * SetPlayerCamera
- */
- #if defined _ALS_TogglePlayerSpectating
- #error _ALS_TogglePlayerSpectating defined
- #endif
- native BAD_TogglePlayerSpectating(playerid, toggle) = TogglePlayerSpectating;
- #if FIX_SetPlayerCamera
- stock FIXES_TogglePlayerSpectating(playerid, toggle)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- if (toggle)
- {
- #if FIXES_Single
- FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_SPECTATING;
- #else
- DeletePVar(playerid, FIXES_pvarPlayerSpectate);
- #endif
- }
- else
- {
- #if FIXES_Single
- FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_SPECTATING;
- #else
- SetPVarInt(playerid, FIXES_pvarPlayerSpectate, 1);
- #endif
- }
- return TogglePlayerSpectating(playerid, toggle);
- }
- return 0;
- }
-
- #define _ALS_TogglePlayerSpectating
- #define TogglePlayerSpectating FIXES_TogglePlayerSpectating
- #endif
- /*
- * FIXES_SetPlayerTime(playerid, hour, minute)
- *
- * FIXES:
- * SetPlayerTime
- */
- #if defined _ALS_SetPlayerTime
- #error _ALS_SetPlayerTime defined
- #endif
- native BAD_SetPlayerTime(playerid, hour, minute) = SetPlayerTime;
- #if FIX_SetPlayerTime
- forward _FIXES_SetTime(playerid, hour, minute);
-
- public _FIXES_SetTime(playerid, hour, minute)
- {
- if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
- {
- return SetPlayerTime(playerid, hour, minute);
- }
- return 0;
- }
-
- stock FIXES_SetPlayerTime(playerid, hour, minute)
- {
- if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
- {
- if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
- {
- return SetTimerEx(FIXES_gscSetTime, 250, 0, FIXES_gscSpec@iii, playerid, hour, minute);
- }
- return SetPlayerTime(playerid, hour, minute);
- }
- return 0;
- }
-
- #define _ALS_SetPlayerTime
- #define SetPlayerTime FIXES_SetPlayerTime
- #endif
- /*
- * FIXES_sleep(const time)
- *
- * FIXES:
- * sleep
- */
- // Uses a little trick to consume part of the line and thus not match
- // our hooked version.
- #if defined _ALS_sleep
- #error _ALS_sleep defined
- #endif
- #define BAD_sleep%0\n%9 sleep%0
- #if FIX_sleep
- stock FIXES_sleep(ms)
- {
- // Call a native function that does very little, but saves the current
- // heap pointer. Then return to save the accurate stack pointer.
- return heapspace(), ms;
- }
-
- #define _ALS_sleep
-
- #define sleep%0\n%9 sleep FIXES_sleep(%0)
- // This fixes another BIZZARE bug. Just doing:
- //
- // #define FIXES_sleep(%0;) FIXES_sleep(%0)
- //
- // Results in:
- //
- // FIXES_sleep(n));
- //
- // Which clearly it shouldn't. I've stepped through the compilation and that
- // extra bracket comes from nowhere!
- #define FIXES_sleep(%0;) FIXES_sleep _FIXES_SLEEP_BRACKET %0);
- #define _FIXES_SLEEP_BRACKET (
- #endif
- /*
- * _FIXES_AddInternal(array[], value, size)
- *
- * Add something to an internal linked list.
- */
- static stock _FIXES_AddInternal(array[], value, size)
- {
- if (array[value] <= value)
- {
- new
- last = size,
- next = array[last];
- while (next < value)
- {
- last = next,
- next = array[last];
- }
- array[next - 1] = value + 1,
- array[(value - 1) % (size + 1)] = (last + 1) % (size + 1),
- array[last] = value,
- array[value] = next;
- }
- }
- /*
- * _FIXES_RemoveInternal(array[], value, size)
- *
- * Remove something from an internal linked list.
- */
- static stock _FIXES_RemoveInternal(array[], value, size)
- {
- if (array[value] > value)
- {
- static
- last;
- // Adjustment for easier "mod"ing.
- ++size,
- last = (array[(value - 1) % size] - 1) % size,
- // Store the reverse value here as well as in the previous slot.
- array[value] =
- // Copy the next value to the last value.
- array[(array[last] = array[value]) - 1] =
- // Set the reverse iterator value.
- (last + 1) % size;
- }
- }
- #undef _FIXES_CEILDIV
- #undef _FIXES_INFINITY
- #undef _FIXES_N_INFINITY
- #undef _FIXES_ATTACHMENTS
- #undef _FIXES_FOREACH
- #undef _FIXES_IS_UNSET
- #undef _FIXES_IS_IN_CHARGE
- #undef _FIXES_IN_RANGE
- #undef _FIXES_NO_RANGE
- #undef _FIXES_FORWARD
- #undef _FIXES_IS_PLAYER_CONNECTED
- #undef FIXES_PRINTF
- #endinput
- // Fix inclusion template.
- #if !defined FIX_NameOfFixHere
- #define FIX_NameOfFixHere (1)
- #elseif _FIXES_IS_UNSET(FIX_NameOfFixHere)
- #undef FIX_NameOfFixHere
- #define FIX_NameOfFixHere (2)
- #endif
- // Fix function template.
- /*
- * FIXES_NameOfFixHere
- *
- * FIXES:
- * NameOfFixHere
- */
- #if defined _ALS_NameOfFixHere
- #error _ALS_NameOfFixHere defined
- #endif
- native BAD_NameOfFixHere(params) = NameOfFixHere;
- #if FIX_NameOfFixHere
- stock FIXES_NameOfFixHere(params)
- {
- return 0;
- }
-
- #define _ALS_NameOfFixHere
- #define NameOfFixHere FIXES_NameOfFixHere
- #endif
|