1
0

fixes.inc 243 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073
  1. /*
  2. * ===============
  3. * INTRODUCTION:
  4. * ===============
  5. *
  6. * fixes.inc - Community patch for buggy SA:MP functions.
  7. *
  8. * ================
  9. * LIST OF FIXES:
  10. * ================
  11. *
  12. * FIX: GetPlayerColor
  13. * PROBLEM: Returns "0" if "SetPlayerColor" has never been called.
  14. * SOLUTION: Call "SetPlayerColor" in "OnPlayerConnect".
  15. * SEE: "OnPlayerConnect".
  16. * AUTHOR: KoczkaHUN
  17. * POST: http://forum.sa-mp.com/showpost.php?p=1486048
  18. *
  19. * FIX: FILTERSCRIPT
  20. * PROBLEM: Despite the fact that is in every new script, many people don't
  21. * define "FILTERSCRIPT" where appropriate.
  22. * SOLUTION: Provide an "IS_FILTERSCRIPT" variable (note the naming to match
  23. * the original macro).
  24. * AUTHOR: Y_Less
  25. * SEE: "OnFilterScriptInit" and "OnGameModeInit".
  26. *
  27. * FIX: SpawnPlayer
  28. * PROBLEM: Kills the player if they are in a vehicle.
  29. * SOLUTION: Remove the from the vehicle.
  30. * SEE: "FIXES_SpawnPlayer".
  31. * AUTHOR: Y_Less
  32. *
  33. * FIX: SetPlayerName
  34. * PROBLEM: Using "SetPlayerName" when the new name only differs from the old
  35. * name in case does not alter the name at all.
  36. * SOLUTION: Change their name twice - once to "_FIXES TEMP NAME" and then to
  37. * the actual required name.
  38. * SEE: "OnPlayerConnect" and "FIXES_SetPlayerName".
  39. * AUTHOR: Y_Less/Slice/xX_Simon_Xx
  40. * POST: https://github.com/Y-Less/sa-mp-fixes/issues/3
  41. *
  42. * FIX: GetPlayerSkin
  43. * PROBLEM: Returns the new skin after "SetSpawnInfo" is called but before the
  44. * player actually respawns to get the new skin.
  45. * SOLUTION: Record the skin in "OnPlayerSpawn" and always return that one.
  46. * SEE: "OnPlayerSpawn", "FIXES_GetPlayerSkin" and "FIXES_SetPlayerSkin".
  47. * AUTHOR: Y_Less
  48. *
  49. * FIX: GetWeaponName
  50. * PROBLEM: Returns nothing for 18, 44, and 45.
  51. * SOLUTION: Return the correct names ("Molotov Cocktail", "Thermal Goggles",
  52. * and "Night vision Goggles").
  53. * SEE: "FIXES_GetWeaponName".
  54. * AUTHOR: Y_Less
  55. *
  56. * FIX: SetPlayerWorldBounds
  57. * PROBLEM: Aiming can bypass the edge.
  58. * SOLUTION: Check for the player leaving the area and reset them to their last
  59. * good position if they leave the area (aiming or not).
  60. * SEE: "OnPlayerUpdate" and "FIXES_SetPlayerWorldBounds".
  61. * AUTHOR: Y_Less
  62. *
  63. * FIX: TogglePlayerControllable
  64. * PROBLEM: Other players see you moving on the spot.
  65. * SOLUTION: Return 0 in OnPlayerUpdate.
  66. * SEE: "FIXES_TogglePlayerControllable" and "OnPlayerUpdate".
  67. * AUTHOR: Slice
  68. * POST: http://forum.sa-mp.com/showpost.php?p=876854
  69. *
  70. * FIX: HydraSniper
  71. * PROBLEM: Entring military aircraft with a sniper rifle messes up vies.
  72. * SOLUTION: Set their armed weapon to fists.
  73. * SEE: "OnPlayerStateChange", "FIXES_GivePlayerWeapon",
  74. * "FIXES_SetPlayerArmedWeapon".
  75. * AUTHOR: funky1234
  76. * POST: http://forum.sa-mp.com/showpost.php?p=965644
  77. *
  78. * FIX: IsPlayerInCheckpoint
  79. * PROBLEM: Function returns an undefined value if it is called before any
  80. * other checkpoint functions are called to initialise the value.
  81. * SOLUTION: Call "DisablePlayerCheckpoint" when they connect.
  82. * SEE: "OnPlayerConnect".
  83. * AUTHOR: Y_Less
  84. *
  85. * FIX: IsPlayerInRaceCheckpoint
  86. * PROBLEM: Function returns an undefined value if it is called before any
  87. * other race checkpoint functions are called to initialise the value.
  88. * SOLUTION: Call "DisablePlayerRaceCheckpoint" when they connect.
  89. * SEE: "OnPlayerConnect".
  90. * AUTHOR: Y_Less
  91. *
  92. * FIX: GetPlayerWeapon
  93. * PROBLEM: Returns the old value after using "SetPlayerArmedWeapon" when they
  94. * are in a vehicle.
  95. * SOLUTION: If "SetPlayerArmedWeapon" is called in a vehicle, store the new
  96. * value and return that instead.
  97. * SEE: "OnPlayerStateChange", "FIXES_SetPlayerArmedWeapon", and
  98. * "FIXES_GetPlayerWeapon".
  99. * AUTHOR: Y_Less
  100. *
  101. * FIX: PutPlayerInVehicle
  102. * PROBLEM: If this is used on a passenger the driver of their old vehicle
  103. * doesn't see them in their new vehicle.
  104. * SOLUTION: Remove them from the vehicle first.
  105. * SEE: "OnPlayerStateChange" and "FIXES_PutPlayerInVehicle".
  106. * AUTHOR: leong124/Y_Less
  107. * POST: http://forum.sa-mp.com/showpost.php?p=1265965
  108. *
  109. * FIX: KEY_AIM
  110. * PROBLEM: "KEY_AIM" isn't defined by default.
  111. * SOLUTION: Define it.
  112. * SEE: N/A.
  113. * AUTHOR: Y_Less
  114. *
  115. * FIX: SetPlayerCheckpoint
  116. * PROBLEM: If a checkpoint is already set it will use the size of that
  117. * checkpoint instead of the new one.
  118. * SOLUTION: Call "DisablePlayerCheckpoint" before setting the checkpoint.
  119. * SEE: "FIXES_SetPlayerCheckpoint".
  120. * AUTHOR: KoczkaHUN
  121. * POST: http://forum.sa-mp.com/showpost.php?p=1482401
  122. *
  123. * FIX: SetPlayerRaceCheckpoint
  124. * PROBLEM: If a checkpoint is already set it will use the size of that
  125. * checkpoint instead of the new one.
  126. * SOLUTION: Call "DisablePlayerRaceCheckpoint" before setting the checkpoint.
  127. * SEE: "FIXES_SetPlayerRaceCheckpoint".
  128. * AUTHOR: KoczkaHUN
  129. * POST: http://forum.sa-mp.com/showpost.php?p=1482401
  130. *
  131. * FIX: TextDrawCreate
  132. * PROBLEM: Crashes on a blank string.
  133. * SOLUTION: Intercept blank strings.
  134. * SEE: "FIXES_TextDrawCreate".
  135. * AUTHOR: wups
  136. * POST: http://forum.sa-mp.com/showpost.php?p=1484008
  137. *
  138. * FIX: TextDrawSetString
  139. * PROBLEM: Crashes on a blank string and size greater than 1024.
  140. * SOLUTION: Intercept blank strings and truncate long strings.
  141. * SEE: "FIXES_TextDrawSetString".
  142. * AUTHOR: TomTrox
  143. * POST: http://forum.sa-mp.com/showpost.php?p=1487870
  144. *
  145. * FIX: CreatePlayerTextDraw
  146. * PROBLEM: Crashes on a blank string.
  147. * SOLUTION: Intercept blank strings.
  148. * SEE: "FIXES_CreatePlayerTextDraw".
  149. * AUTHOR: wups/Y_Less
  150. *
  151. * FIX: PlayerTextDrawSetString
  152. * PROBLEM: Crashes on a blank string and size greater than 1024.
  153. * SOLUTION: Intercept blank strings and truncate long strings.
  154. * SEE: "FIXES_PlayerTextDrawSetString".
  155. * AUTHOR: TomTrox/Y_Less
  156. *
  157. * FIX: AllowInteriorWeapons
  158. * PROBLEM: Does nothing.
  159. * SOLUTION: Set the player's weapon to fists in an interior.
  160. * SEE: "FIXES_AllowInteriorWeapons", "OnGameModeInit" and
  161. * "OnPlayerUpdate".
  162. * AUTHOR: KoczkaHUN
  163. * POST: http://forum.sa-mp.com/showpost.php?p=1502696
  164. *
  165. * FIX: OnPlayerEnterVehicle
  166. * PROBLEM: Crashes other players when people enter an invalid seat.
  167. * SOLUTION: Desync the people with invalid seats.
  168. * SEE: "OnPlayerStateChange" and "OnPlayerUpdate".
  169. * AUTHOR: RyDeR`/Y_Less
  170. * POST: http://forum.sa-mp.com/showpost.php?p=1410296
  171. *
  172. * FIX: OnPlayerEnterVehicle_2
  173. * PROBLEM: Crashes the server when hacks enter an invalid vehicle.
  174. * SOLUTION: Desync the people with invalid vehicles.
  175. * SEE: "OnPlayerEnterVehicle".
  176. * AUTHOR: im/Y_Less
  177. * POST: http://forum.sa-mp.com/showpost.php?p=2340900
  178. *
  179. * FIX: AllowTeleport
  180. * PROBLEM: 0.3dRC9 removed "AllowPlayerTeleport" and "AllowAdminTeleport" in
  181. * favour of "OnPlayerClickMap". Some scripts used the old code and.
  182. * SOLUTION: Teleport the player in "OnPlayerClickMap".
  183. * SEE: "OnPlayerClickMap", "FIXES_AllowPlayerTeleport", and
  184. * "FIXES_AllowAdminTeleport".
  185. * AUTHOR: Y_Less
  186. *
  187. * FIX: SetPlayerSpecialAction
  188. * PROBLEM: Removing jetpacks from players by setting their special action to 0
  189. * causes the sound to stay until death.
  190. * SOLUTION: Call "ClearAnimations" before "SetPlayerSpecialAction".
  191. * SEE: "FIXES_SetPlayerSpecialAction".
  192. * AUTHOR: MP2
  193. * POST: Private message from MP2.
  194. *
  195. * FIX: OnDialogResponse
  196. * PROBLEM: Cheaters can spoof the dialogid they are using to respond to ones
  197. * they can't actually see.
  198. * SOLUTION: Store the displayed dialogid and use that instead.
  199. * SEE: "FIXES_OnDialogResponse", "FIXES_ShowPlayerDialog".
  200. * AUTHOR: Y_Less
  201. * FIXED IN: 0.3e RC6
  202. *
  203. * FIX: GetPlayerDialog
  204. * PROBLEM: This function doesn't exist. Fixed for hidden dialogs.
  205. * SOLUTION: Add it. DEFAULTS TO FALSE!
  206. * SEE: "FIXES_GetPlayerDialog".
  207. * AUTHOR: Y_Less/xX_Simon_Xx
  208. * POST: http://forum.sa-mp.com/showpost.php?p=2141254
  209. *
  210. * FIX: PlayerDialogResponse
  211. * PROBLEM: A player's dialog doesn't hide when the gamemode restarts, causing
  212. * the server to print "Warning: PlayerDialogResponse PlayerId: 0
  213. * dialog ID doesn't match last sent dialog ID".
  214. * SOLUTION: Hide it.
  215. * SEE: "OnPlayerConnect", "OnGameModeExit".
  216. * AUTHOR: xX_Simon_Xx
  217. * POST: https://github.com/Y-Less/sa-mp-fixes/issues/2
  218. *
  219. * FIX: SetSpawnInfo
  220. * PROBLEM: Kicks the player if "SpawnPlayer" is called before "SetSpawnInfo".
  221. * SOLUTION: Call "SetSpawnInfo" at least once.
  222. * SEE: "OnPlayerConnect".
  223. * AUTHOR: Y_Less
  224. *
  225. * FIX: SetPlayerSkin
  226. * PROBLEM: Breaks sitting on bikes.
  227. * SOLUTION: Put them back in the vehicle after setting their skin.
  228. * SEE: "FIXES_SetPlayerSkin".
  229. * AUTHOR: CyNiC
  230. * POST: http://forum.sa-mp.com/showpost.php?p=1756094
  231. *
  232. * FIX: HideMenuForPlayer
  233. * PROBLEM: Crashes when passed an invalid menu ID.
  234. * SOLUTION: Don't hide it when passed an invalid menu.
  235. * SEE: "FIXES_HideMenuForPlayer".
  236. * AUTHOR: Y_Less
  237. * POST: http://forum.sa-mp.com/showpost.php?p=1787297
  238. *
  239. * FIX: valstr
  240. * PROBLEM: Crashes on large numbers.
  241. * SOLUTION: Use "format" instead.
  242. * SEE: "FIXES_valstr".
  243. * AUTHOR: Slice
  244. * POST: http://forum.sa-mp.com/showpost.php?p=1790300
  245. *
  246. * FIX: fclose
  247. * PROBLEM: Crashes on an invalid handle.
  248. * SOLUTION: Check for an invalid handle.
  249. * SEE: "FIXES_fclose".
  250. * AUTHOR: Slice
  251. * POST: http://forum.sa-mp.com/showpost.php?p=1790300
  252. *
  253. * FIX: fwrite
  254. * PROBLEM: Crashes on an invalid handle.
  255. * SOLUTION: Check for an invalid handle.
  256. * SEE: "FIXES_fwrite".
  257. * AUTHOR: Slice
  258. * POST: http://forum.sa-mp.com/showpost.php?p=1790300
  259. *
  260. * FIX: fread
  261. * PROBLEM: Crashes on an invalid handle.
  262. * SOLUTION: Check for an invalid handle.
  263. * SEE: "FIXES_fread".
  264. * AUTHOR: Slice
  265. * POST: http://forum.sa-mp.com/showpost.php?p=1790300
  266. *
  267. * FIX: fputchar
  268. * PROBLEM: Crashes on an invalid handle.
  269. * SOLUTION: Check for an invalid handle.
  270. * SEE: "FIXES_fputchar".
  271. * AUTHOR: Slice
  272. * POST: http://forum.sa-mp.com/showpost.php?p=1790300
  273. *
  274. * FIX: fgetchar
  275. * PROBLEM: Crashes on an invalid handle.
  276. * SOLUTION: Check for an invalid handle.
  277. * SEE: "FIXES_fgetchar".
  278. * AUTHOR: Slice
  279. * POST: http://forum.sa-mp.com/showpost.php?p=1790300
  280. *
  281. * FIX: fblockwrite
  282. * PROBLEM: Crashes on an invalid handle.
  283. * SOLUTION: Check for an invalid handle.
  284. * SEE: "FIXES_fblockwrite".
  285. * AUTHOR: Slice
  286. * POST: http://forum.sa-mp.com/showpost.php?p=1790300
  287. *
  288. * FIX: fblockread
  289. * PROBLEM: Crashes on an invalid handle.
  290. * SOLUTION: Check for an invalid handle.
  291. * SEE: "FIXES_fblockread".
  292. * AUTHOR: Slice
  293. * POST: http://forum.sa-mp.com/showpost.php?p=1790300
  294. *
  295. * FIX: fseek
  296. * PROBLEM: Crashes on an invalid handle.
  297. * SOLUTION: Check for an invalid handle.
  298. * SEE: "FIXES_fseek".
  299. * AUTHOR: Slice
  300. * POST: http://forum.sa-mp.com/showpost.php?p=1790300
  301. *
  302. * FIX: flength
  303. * PROBLEM: Crashes on an invalid handle.
  304. * SOLUTION: Check for an invalid handle.
  305. * SEE: "FIXES_flength".
  306. * AUTHOR: Slice
  307. * POST: http://forum.sa-mp.com/showpost.php?p=1790300
  308. *
  309. * FIX: file_inc
  310. * PROBLEM: Includes or excludes all the file function fixes together (can
  311. * cause major overhead).
  312. * SOLUTION: Optionally group them all under one define. DEFAULTS TO FALSE!
  313. * SEE: "FIX_file_inc".
  314. * AUTHOR: Y_Less
  315. *
  316. * FIX: IsPlayerAttachedObjectSlotUsed
  317. * PROBLEM: Doesn't work in OnPlayerDisconnect.
  318. * SOLUTION: Maintain an internal record of slots used.
  319. * SEE: "FIXES_SetPlayerAttachedObject",
  320. * "FIXES_RemovePlayerAttachedObject",
  321. * "FIXES_IsPAttachedObjectSlotUsed", and
  322. * "OnPlayerDisconnect".
  323. * AUTHOR: Y_Less
  324. *
  325. * FIX: SetPlayerAttachedObject
  326. * PROBLEM: Doesn't remove objects when the mode ends.
  327. * SOLUTION: Remove them.
  328. * SEE: "FIXES_SetPlayerAttachedObject",
  329. * "FIXES_RemovePlayerAttachedObject", and
  330. * "OnPlayerDisconnect".
  331. * AUTHOR: Y_Less
  332. *
  333. * FIX: OnPlayerDeath
  334. * PROBLEM: Clients get stuck when they die with an animation applied.
  335. * SOLUTION: Clear their animations.
  336. * SEE: "OnPlayerDeath" and "OnPlayerUpdate".
  337. * AUTHOR: h02
  338. * POST: http://forum.sa-mp.com/showpost.php?p=1641144
  339. *
  340. * FIX: strins
  341. * PROBLEM: Ignores the "maxlength" parameter causing possible crashes.
  342. * SOLUTION: Manually check the length.
  343. * SEE: "FIXES_strins".
  344. * AUTHOR: Slice/Y_Less
  345. * POST: http://forum.sa-mp.com/showpost.php?p=1860495
  346. * POST: http://forum.sa-mp.com/showpost.php?p=1864706
  347. *
  348. * FIX: IsPlayerConnected
  349. * PROBLEM: Only uses the lower two bytes of a passed ID.
  350. * SOLUTION: Mask the numbers.
  351. * SEE: "FIXES_IsPlayerConnected".
  352. * AUTHOR: Slice
  353. * POST: http://forum.sa-mp.com/showpost.php?p=1860464
  354. *
  355. * FIX: OnPlayerCommandText
  356. * PROBLEM: Can crash ZCMD when passed a null string.
  357. * SOLUTION: Pass NULL if invalid inputs given.
  358. * SEE: "OnPlayerCommandText".
  359. * AUTHOR: Y_Less
  360. * POST: http://forum.sa-mp.com/showpost.php?p=1909511
  361. *
  362. * FIX: TrainExit
  363. * PROBLEM: When getting out of a train entered by "PutPlayerInVehicle", the
  364. * camera does not reset properly.
  365. * SOLUTION: Reset the camera.
  366. * SEE: "FIXES_PutPlayerInVehicle", "FIXES_OnPlayerStateChange".
  367. * AUTHOR: Terminator3/Y_Less
  368. * POST: http://forum.sa-mp.com/showpost.php?p=1980214
  369. *
  370. * FIX: Kick
  371. * PROBLEM: Calling "Kick" in "OnPlayerConnect" doesn't work properly.
  372. * SOLUTION: Defer it.
  373. * SEE: "OnPlayerConnect", "FIXES_Kick".
  374. * AUTHOR: Y_Less
  375. * POST: http://forum.sa-mp.com/showpost.php?p=1989453
  376. * FIXED IN: 0.3x
  377. *
  378. * FIX: OnVehicleMod
  379. * PROBLEM: Crashes other players when invalid mods are applied.
  380. * SOLUTION: Desync the player.
  381. * SEE: "OnVehicleMod".
  382. * AUTHOR: JernejL/Y_Less
  383. * POST: http://forum.sa-mp.com/showpost.php?p=1671500
  384. *
  385. * FIX: random
  386. * PROBLEM: Doesn't work with negative numbers.
  387. * SOLUTION: Invert then reinvert. DEFAULTS TO FALSE!
  388. * SEE: "FIXES_random".
  389. * AUTHOR: xX_Simon_Xx
  390. * POST: http://forum.sa-mp.com/showpost.php?p=2141254
  391. *
  392. * FIX: sleep
  393. * PROBLEM: Leaks bytes from the stack.
  394. * SOLUTION: Call a function to store the correct value.
  395. * SEE: "FIXES_sleep".
  396. * AUTHOR: Y_Less
  397. *
  398. * FIX: AddMenuItem
  399. * PROBLEM: Crashes when passed an invalid menu ID.
  400. * SOLUTION: Don't hide it when passed an invalid menu.
  401. * SEE: "FIXES_AddMenuItem".
  402. * AUTHOR: Y_Less
  403. *
  404. * FIX: SetMenuColumnHeader
  405. * PROBLEM: Crashes when passed an invalid menu ID.
  406. * SOLUTION: Don't hide it when passed an invalid menu.
  407. * SEE: "FIXES_SetMenuColumnHeader".
  408. * AUTHOR: Y_Less
  409. *
  410. * FIX: ShowMenuForPlayer
  411. * PROBLEM: Crashes when passed an invalid menu ID.
  412. * SOLUTION: Don't hide it when passed an invalid menu.
  413. * SEE: "FIXES_ShowMenuForPlayer".
  414. * AUTHOR: Y_Less
  415. *
  416. * FIX: HideMenuForPlayer
  417. * PROBLEM: Crashes when passed an invalid menu ID.
  418. * SOLUTION: Don't hide it when passed an invalid menu.
  419. * SEE: "FIXES_HideMenuForPlayer".
  420. * AUTHOR: Y_Less
  421. * POST: http://forum.sa-mp.com/showpost.php?p=1787297
  422. *
  423. * FIX: HideMenuForPlayer_2
  424. * PROBLEM: Ignores the "menuid" parameter.
  425. * SOLUTION: Only hide the correct menu. DEFAULTS TO FALSE!
  426. * SEE: "FIXES_HideMenuForPlayer".
  427. * AUTHOR: Y_Less
  428. *
  429. * FIX: DisableMenu
  430. * PROBLEM: Crashes when passed an invalid menu ID.
  431. * SOLUTION: Don't hide it when passed an invalid menu.
  432. * SEE: "FIXES_DisableMenu".
  433. * AUTHOR: Y_Less
  434. *
  435. * FIX: DisableMenuRow
  436. * PROBLEM: Crashes when passed an invalid menu ID.
  437. * SOLUTION: Don't hide it when passed an invalid menu.
  438. * SEE: "FIXES_DisableMenuRow".
  439. * AUTHOR: Y_Less
  440. *
  441. * FIX: Menus
  442. * PROBLEM: All menu function fixes are included separately for major overhead.
  443. * SOLUTION: Optionally group them all under one define.
  444. * SEE: "FIX_Menus", "_FIX_Menus"
  445. * AUTHOR: Y_Less
  446. *
  447. * FIX: GetPlayerMenu
  448. * PROBLEM: Returns previous menu when none is displayed.
  449. * SOLUTION: Return the correct value.
  450. * SEE: "FIXES_GetPlayerMenu", "OnPlayerSelectedMenuRow".
  451. * AUTHOR: Y_Less
  452. * POST: http://forum.sa-mp.com/showpost.php?p=2295867
  453. *
  454. * FIX: GetPlayerInterior
  455. * PROBLEM: Always returns 0 for NPCs.
  456. * SOLUTION: Return the correct value.
  457. * SEE: "FIXES_GetPlayerInterior", "FIXES_SetPlayerInterior".
  458. * AUTHOR: Y_Less/xX_Simon_Xx
  459. * POST: http://forum.sa-mp.com/showpost.php?p=2309246
  460. *
  461. * FIX: ClearAnimations
  462. * PROBLEM: Use ClearAnimation while you are in a vehicle cause the player exit
  463. * from it.
  464. * SOLUTION: Apply an animation instead of clear animation.
  465. * SEE: "FIXES_ClearAnimations".
  466. * AUTHOR: xX_Simon_Xx
  467. * POST: https://github.com/Y-Less/sa-mp-fixes/issues/4
  468. *
  469. * FIX: ClearAnimations_2
  470. * PROBLEM: ClearAnimations doesn't do anything when the animation ends if we
  471. * pass 1 for the freeze parameter in ApplyAnimation.
  472. * SOLUTION: Apply an idle animation for stop and then use ClearAnimation.
  473. * SEE: "FIXES_ClearAnimations".
  474. * AUTHOR: xX_Simon_Xx
  475. * POST: https://github.com/Y-Less/sa-mp-fixes/issues/4
  476. *
  477. * FIX: DriveBy
  478. * PROBLEM: If you press KEY_CROUCH while you're passenger and if you are
  479. * armed, the player start to aim; if you repress KEY_CROUCH the
  480. * player don't return in vehicle.
  481. * SOLUTION: Apply the animation to return the player in the vehicle.
  482. * SEE: "OnPlayerKeyStateChange".
  483. * AUTHOR: xX_Simon_Xx
  484. * POST: https://github.com/Y-Less/sa-mp-fixes/issues/13
  485. *
  486. * FIX: GangZoneCreate
  487. * PROBLEM: Gang zones bug on the main map for players at certain angles
  488. * relative to them.
  489. * SOLUTION: Set a non floating value for the gang zone co-ordinate.
  490. * SEE: "FIXES_GangZoneCreate".
  491. * AUTHOR: xX_Simon_Xx/Y_Less
  492. * POST: http://forum.sa-mp.com/showpost.php?p=2144109
  493. *
  494. * FIX: SPECIAL_ACTION_PISSING
  495. * PROBLEM: "SPECIAL_ACTION_PISSING" isn't defined by default.
  496. * SOLUTION: Define it.
  497. * SEE: N/A.
  498. * AUTHOR: xX_Simon_Xx
  499. * POST: https://github.com/Y-Less/sa-mp-fixes/issues/6
  500. *
  501. * FIX: IsValidVehicle
  502. * PROBLEM: "IsValidVehicle" isn't defined by default.
  503. * SOLUTION: Define it.
  504. * SEE: N/A.
  505. * AUTHOR: xX_Simon_Xx
  506. * POST: http://forum.sa-mp.com/showpost.php?p=2693650
  507. *
  508. * FIX: ApplyAnimation
  509. * PROBLEM: Passing an invalid animation library in ApplyAnimation causes a
  510. * client crash for streamed in players.
  511. * SOLUTION: Block ApplyAnimation when an invalid library is passed.
  512. * SEE: "FIXES_ApplyAnimation".
  513. * AUTHOR: xX_Simon_Xx
  514. * POST: https://github.com/Y-Less/sa-mp-fixes/issues/5
  515. *
  516. * FIX: ApplyAnimation_2
  517. * PROBLEM: First time a library is used, it does nothing.
  518. * SOLUTION: Apply animations twice when first using a library.
  519. * SEE: "FIXES_ApplyAnimation".
  520. * AUTHOR: xX_Simon_Xx/Lordzy/Y_Less
  521. * POST: http://forum.sa-mp.com/showpost.php?p=3052627
  522. *
  523. * FIX: OnPlayerSpawn
  524. * PROBLEM: San Andreas deducts $100 from players.
  525. * SOLUTION: Give them it back.
  526. * SEE: "OnPlayerSpawn".
  527. * AUTHOR: Y_Less
  528. *
  529. * FIX: GetGravity
  530. * PROBLEM: "GetGravity" isn't defined by default.
  531. * SOLUTION: Define it.
  532. * SEE: N/A.
  533. * AUTHOR: Whitetiger
  534. * POST: http://forum.sa-mp.com/showpost.php?p=1706447
  535. *
  536. * FIX: gpci
  537. * PROBLEM: "gpci" isn't defined by default.
  538. * SOLUTION: Define it.
  539. * SEE: N/A.
  540. * AUTHOR: xX_Simon_Xx
  541. * POST: http://pastebin.com/VQSGpbSm
  542. *
  543. * FIX: Natives
  544. * PROBLEM: Several natives are included by default, this enables or disables
  545. * them all. Therefore this is an umbrella fix for several fixes.
  546. * SOLUTION: Define them.
  547. * SEE: "FIX_GetGravity", "FIX_gpci", "FIX_IsValidVehicle".
  548. * AUTHOR: Y_Less
  549. *
  550. * FIX: OnPlayerConnect
  551. * PROBLEM: This function isn't called for players when a filterscript starts.
  552. * SOLUTION: Call it for all connected players.
  553. * SEE: "FIXES_OnFilterScriptInit".
  554. * AUTHOR: Y_Less
  555. *
  556. * FIX: OnPlayerDisconnect
  557. * PROBLEM: This function isn't called for players when a filterscript ends.
  558. * SOLUTION: Call it for all connected players.
  559. * SEE: "FIXES_OnFilterScriptExit".
  560. * AUTHOR: Y_Less
  561. *
  562. * FIX: GameText
  563. * PROBLEM: Several styles do not display for the time specified.
  564. * SOLUTION: Recreate the styles in Text Draws and use those instead.
  565. * SEE: "FIXES_GameTextForAll", "FIXES_GameTextForPlayer".
  566. * AUTHOR: Y_Less
  567. *
  568. * FIX: GameTextStyles
  569. * PROBLEM: San Andreas has fixed styles for area and vehicle names, but they
  570. * are not included in the GameText styles list.
  571. * SOLUTION: Add them. DEFAULTS TO FALSE.
  572. * SEE: "FIXES_GameTextForAll", "FIXES_GameTextForPlayer".
  573. * AUTHOR: Y_Less
  574. *
  575. * FIX: HideGameText
  576. * PROBLEM: There is no "HideGameTextForXYZ" function.
  577. * SOLUTION: Show a single space for a game text. DEFAULTS TO FALSE.
  578. * SEE: "FIXES_HideGameTextForAll", "FIXES_HideGameTextForPlayer".
  579. * AUTHOR: Y_Less
  580. *
  581. * FIX: BODYPARTS
  582. * PROBLEM: The bodyparts to be used in OnPlayer(Take/Give)Damage are not
  583. * defined by default
  584. * SOLUTION: Define it.
  585. * SEE: N/A.
  586. * AUTHOR: Whitetiger
  587. *
  588. * FIX: CAMERAMODES
  589. * PROBLEM: The camera modes for GetPlayerCameraMode are not defined by
  590. * default.
  591. * SOLUTION: Define it.
  592. * SEE: N/A.
  593. * AUTHOR: Whitetiger
  594. * POST: http://forum.sa-mp.com/showpost.php?p=1309730
  595. *
  596. * FIX: SetPlayerCamera
  597. * PROBLEM: Using the camera functions directly after enabling spectator mode
  598. * doesn't work.
  599. * SOLUTION: Defer them.
  600. * SEE: "FIXES_SetPlayerCameraPos", "FIXES_SetPlayerCameraLookAt",
  601. * "FIXES_TogglePlayerSpectating".
  602. * AUTHOR: Emmet_
  603. *
  604. * FIX: SetPlayerTime
  605. * PROBLEM: Using this function under "OnPlayerConnect" doesn't work.
  606. * SOLUTION: Defer it.
  607. * SEE: "FIXES_SetPlayerTime"
  608. * AUTHOR: Emmet_
  609. *
  610. * FIX: OnPlayerRequestClass
  611. * PROBLEM: Random blunts and bottles sometimes appear in class selection.
  612. * SOLUTION: Call "RemoveBuildingForPlayer".
  613. * SEE: "OnPlayerRequestClass"
  614. * AUTHOR: Y_Less
  615. *
  616. * ==============
  617. * STYLE RULES:
  618. * ==============
  619. *
  620. * All globals should be "static stock" whenever possible (so they can only be
  621. * accessed from this one file).
  622. *
  623. * Statics must start with "FIXES_gs", and all other globals with "FIXES_g".
  624. *
  625. * All functions not overriding existing functions must start with "FIXES_".
  626. *
  627. * Macros must be upper case, use underscores, and start "FIXES_":
  628. * "FIXES_LIKE_THIS".
  629. *
  630. * Functions should be upper camel case (as the original functions are)
  631. * "FIXES_LikeThis".
  632. *
  633. * Globals (after the prefix) should be upper camel case "LikeThis", and locals
  634. * lower camel case "likeThis".
  635. *
  636. * ALS should be used to hook functions and callbacks. See this topic for more
  637. * details:
  638. *
  639. * http://forum.sa-mp.com/showthread.php?t=441293
  640. *
  641. * The ALS prefix for chaining is "FIXES_".
  642. *
  643. * When redefining a native, add a "BAD_" external name declaration with the
  644. * "_ALS_" definition so that others may use the original native if they so
  645. * desire (with the caveat that it may break all fixes). Note the "BAD_"
  646. * name is meant to indicate the possibility of breaking the fix, not a
  647. * comment on the original native function.
  648. *
  649. * The ALS hook defines used here are a little different to the normal ones as
  650. * this file assumes that it is always first. The pattern is:
  651. *
  652. * #if defined _ALS_NameOfFixHere
  653. * #error _ALS_NameOfFixHere defined
  654. * #endif
  655. * native BAD_NameOfFixHere(params) = NameOfFixHere;
  656. *
  657. * #if FIX_NameOfFixHere
  658. * stock FIXES_NameOfFixHere(params)
  659. * {
  660. * return 0;
  661. * }
  662. *
  663. * #define _ALS_NameOfFixHere
  664. * #define NameOfFixHere FIXES_NameOfFixHere
  665. * #endif
  666. *
  667. * A copyable version of this pattern is at the end of the file.
  668. *
  669. * Enums start with "E_" or "e_" depending on type, then follow rules for
  670. * macros.
  671. *
  672. * NO libraries should be included - not even the default SA:MP ones. Let the
  673. * user do it.
  674. *
  675. * Due to the above rule, you cannot assume any third party libraries AT ALL, so
  676. * do not use them. This can lead to some code duplication, but also means
  677. * that the version of the code used here can be tailored for optimisations.
  678. *
  679. * Certain terms may be shortened when dealing with long callback names to avoid
  680. * compile truncation warnings (max symbol length is 31). Current list:
  681. *
  682. * "Checkpoint" -> "CP"
  683. * "Update" -> "Upd"
  684. * "TextDraw" -> "TD"
  685. * "Object" -> "Obj"
  686. * "Player" -> "P"
  687. *
  688. * Document all fixes at the top of the file, and highlight code.
  689. *
  690. * 4 space TABS - do not edit this file in PAWNO unless you know how to correct
  691. * the indentation.
  692. *
  693. * All rules have exceptions, but they must be justifiable. For example
  694. * "IS_FILTERSCRIPT" is a global variable, but is not called
  695. * "FIXES_gIsFilterscript" to better match the "FILTERSCRIPT" macro it
  696. * replaces. Now a macro for "_FIXES_gIsFilterscript".
  697. *
  698. * Variables which need to be fully global (i.e. not "static"), but should not
  699. * actually be used by other people (e.g. appear inside a macro) should be
  700. * prefixed with "_FIXES" instead of "FIXES" to indicate their private use.
  701. *
  702. * No comments beyond the end of column 80 (where the line in "PAWNO" is).
  703. *
  704. * If a bug is fixed in some version of the server it can be conditionally
  705. * included here. This is done by checking for the existance of a native
  706. * function introduced in the same server version. For example
  707. * "TogglePlayerControllable" was fixed in 0.3eRC6, the same time as the
  708. * "SetObjectMaterial" native was introduced, thus the inclusion becomes:
  709. *
  710. * #if !defined FIX_TogglePlayerControllable
  711. * #if defined SetObjectMaterial
  712. * #define FIX_TogglePlayerControllable (0)
  713. * #else
  714. * #define FIX_TogglePlayerControllable (1)
  715. * #endif
  716. * #elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable)
  717. * #undef FIX_TogglePlayerControllable
  718. * #define FIX_TogglePlayerControllable (2)
  719. * #endif
  720. *
  721. * This only includes this fix if that native doesn't exist. A copyable
  722. * version of this pattern is at the end of the file.
  723. *
  724. * To reduce general memory consumption, strings in this include are stored
  725. * globally in constant arrays and referenced. This is EXACTLY as fast as
  726. * using the string constants directly, but means that strings are not
  727. * stored in the assembly multiple times (unless the string is only used
  728. * once, in which case it's more work for no gain). See this post for more
  729. * details:
  730. *
  731. * http://forum.sa-mp.com/showpost.php?p=1795601
  732. *
  733. * DO NOT EDIT THIS FILE IN PAWNO OR ON GITHUB. Both mess up the spacing -
  734. * GitHub in an almost irreversible way (except for the fact that nothing is
  735. * irreversible in source control. Pawno spacing is less tricky to solve,
  736. * and can be worked around if you know when it uses spaces and tabs - in
  737. * short, always write code first THEN indent and you won't have a problem
  738. * (in that editor at least, that is normally a bad way to write code).
  739. *
  740. * Documentation explanation:
  741. *
  742. * FIX: <Short name>
  743. * PROBLEM: <Description of problem>
  744. * SOLUTION: <Description of solution>
  745. * SEE: <List of relevant functions>
  746. * AUTHOR: <Person who wrote the fix>
  747. * POST: <Optional link to the original post where applicable>
  748. * FIXED IN: <Optional server version of official fix where applicable>
  749. *
  750. */
  751. #if defined _INC_SAMP_Community_fixes
  752. #endinput
  753. #endif
  754. #define _INC_SAMP_Community_fixes
  755. #if !defined _inc_fixes
  756. #define _inc_fixes
  757. #endif
  758. #define _FIXES_IS_UNSET(%0) ((2*%0-1+1)==-1)
  759. // We can add server version compiler code here to only compile fixes that apply
  760. // to the version of the includes for which the user is compiling.
  761. #if !defined FIX_GetPlayerColour
  762. #if defined FIX_GetPlayerColor
  763. #if _FIXES_IS_UNSET(FIX_GetPlayerColor)
  764. #define FIX_GetPlayerColour (2)
  765. #else
  766. #define FIX_GetPlayerColour (FIX_GetPlayerColor)
  767. #endif
  768. #else
  769. #define FIX_GetPlayerColour (1)
  770. #endif
  771. #elseif _FIXES_IS_UNSET(FIX_GetPlayerColour)
  772. #undef FIX_GetPlayerColour
  773. #define FIX_GetPlayerColour (2)
  774. #endif
  775. #if !defined FIX_FILTERSCRIPT
  776. #define FIX_FILTERSCRIPT (1)
  777. #elseif _FIXES_IS_UNSET(FIX_FILTERSCRIPT)
  778. #undef FIX_FILTERSCRIPT
  779. #define FIX_FILTERSCRIPT (2)
  780. #endif
  781. #if !defined FIX_SpawnPlayer
  782. #define FIX_SpawnPlayer (1)
  783. #elseif _FIXES_IS_UNSET(FIX_SpawnPlayer)
  784. #undef FIX_SpawnPlayer
  785. #define FIX_SpawnPlayer (2)
  786. #endif
  787. #if !defined FIX_SetPlayerName
  788. #define FIX_SetPlayerName (1)
  789. #elseif _FIXES_IS_UNSET(FIX_SetPlayerName)
  790. #undef FIX_SetPlayerName
  791. #define FIX_SetPlayerName (2)
  792. #endif
  793. #if !defined FIX_GetPlayerSkin
  794. #define FIX_GetPlayerSkin (1)
  795. #elseif _FIXES_IS_UNSET(FIX_GetPlayerSkin)
  796. #undef FIX_GetPlayerSkin
  797. #define FIX_GetPlayerSkin (2)
  798. #endif
  799. #if !defined FIX_GetWeaponName
  800. #define FIX_GetWeaponName (1)
  801. #elseif _FIXES_IS_UNSET(FIX_GetWeaponName)
  802. #undef FIX_GetWeaponName
  803. #define FIX_GetWeaponName (2)
  804. #endif
  805. #if !defined FIX_SetPlayerWorldBounds
  806. #define FIX_SetPlayerWorldBounds (1)
  807. #elseif _FIXES_IS_UNSET(FIX_SetPlayerWorldBounds)
  808. #undef FIX_SetPlayerWorldBounds
  809. #define FIX_SetPlayerWorldBounds (2)
  810. #endif
  811. #if !defined FIX_TogglePlayerControllable
  812. #if defined SetObjectMaterial
  813. #define FIX_TogglePlayerControllable (0)
  814. #else
  815. #define FIX_TogglePlayerControllable (1)
  816. #endif
  817. #elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable)
  818. #undef FIX_TogglePlayerControllable
  819. #define FIX_TogglePlayerControllable (2)
  820. #endif
  821. #if !defined FIX_HydraSniper
  822. #define FIX_HydraSniper (1)
  823. #elseif _FIXES_IS_UNSET(FIX_HydraSniper)
  824. #undef FIX_HydraSniper
  825. #define FIX_HydraSniper (2)
  826. #endif
  827. #if !defined FIX_IsPlayerInCheckpoint
  828. #define FIX_IsPlayerInCheckpoint (1)
  829. #elseif _FIXES_IS_UNSET(FIX_IsPlayerInCheckpoint)
  830. #undef FIX_IsPlayerInCheckpoint
  831. #define FIX_IsPlayerInCheckpoint (2)
  832. #endif
  833. #if !defined FIX_IsPlayerInRaceCheckpoint
  834. #define FIX_IsPlayerInRaceCheckpoint (1)
  835. #elseif _FIXES_IS_UNSET(FIX_IsPlayerInRaceCheckpoint)
  836. #undef FIX_IsPlayerInRaceCheckpoint
  837. #define FIX_IsPlayerInRaceCheckpoint (2)
  838. #endif
  839. #if !defined FIX_GetPlayerWeapon
  840. #define FIX_GetPlayerWeapon (1)
  841. #elseif _FIXES_IS_UNSET(FIX_GetPlayerWeapon)
  842. #undef FIX_GetPlayerWeapon
  843. #define FIX_GetPlayerWeapon (2)
  844. #endif
  845. #if !defined FIX_PutPlayerInVehicle
  846. #define FIX_PutPlayerInVehicle (1)
  847. #elseif _FIXES_IS_UNSET(FIX_PutPlayerInVehicle)
  848. #undef FIX_PutPlayerInVehicle
  849. #define FIX_PutPlayerInVehicle (2)
  850. #endif
  851. #if !defined FIX_KEY_AIM
  852. #if defined KEY_AIM
  853. #define FIX_KEY_AIM (0)
  854. #else
  855. #define FIX_KEY_AIM (1)
  856. #endif
  857. #elseif _FIXES_IS_UNSET(FIX_KEY_AIM)
  858. #undef FIX_KEY_AIM
  859. #define FIX_KEY_AIM (2)
  860. #endif
  861. #if !defined FIX_SPECIAL_ACTION_PISSING
  862. #if defined SPECIAL_ACTION_PISSING
  863. #define FIX_SPECIAL_ACTION_PISSING (0)
  864. #else
  865. #define FIX_SPECIAL_ACTION_PISSING (1)
  866. #endif
  867. #elseif _FIXES_IS_UNSET(FIX_SPECIAL_ACTION_PISSING)
  868. #undef FIX_SPECIAL_ACTION_PISSING
  869. #define FIX_SPECIAL_ACTION_PISSING (2)
  870. #endif
  871. #if !defined FIX_Natives
  872. #define FIX_Natives (1)
  873. #elseif _FIXES_IS_UNSET(FIX_Natives)
  874. #undef FIX_Natives
  875. #define FIX_Natives (2)
  876. #endif
  877. #if !defined FIX_IsValidVehicle
  878. #if defined IsValidVehicle
  879. #define FIX_IsValidVehicle (0)
  880. #else
  881. #define FIX_IsValidVehicle (FIX_Natives)
  882. #endif
  883. #elseif _FIXES_IS_UNSET(FIX_IsValidVehicle)
  884. #undef FIX_IsValidVehicle
  885. #define FIX_IsValidVehicle (2)
  886. #endif
  887. #if !defined FIX_GetGravity
  888. #if defined GetGravity
  889. #define FIX_GetGravity (0)
  890. #else
  891. #define FIX_GetGravity (FIX_Natives)
  892. #endif
  893. #elseif _FIXES_IS_UNSET(FIX_GetGravity)
  894. #undef FIX_GetGravity
  895. #define FIX_GetGravity (2)
  896. #endif
  897. #if !defined FIX_gpci
  898. #if defined gpci
  899. #define FIX_gpci (0)
  900. #else
  901. #define FIX_gpci (FIX_Natives)
  902. #endif
  903. #elseif _FIXES_IS_UNSET(FIX_gpci)
  904. #undef FIX_gpci
  905. #define FIX_gpci (2)
  906. #endif
  907. #if !defined FIX_BODYPARTS
  908. #if defined BODY_PART_TORSO
  909. #define FIX_BODYPARTS (0)
  910. #else
  911. #define FIX_BODYPARTS (1)
  912. #endif
  913. #elseif _FIXES_IS_UNSET(FIX_BODYPARTS)
  914. #undef FIX_BODYPARTS
  915. #define FIX_BODYPARTS (2)
  916. #endif
  917. #if !defined FIX_CAMERAMODES
  918. #if defined CAM_MODE_NONE
  919. #define FIX_CAMERAMODES (0)
  920. #else
  921. #define FIX_CAMERAMODES (1)
  922. #endif
  923. #elseif _FIXES_IS_UNSET(FIX_CAMERAMODES)
  924. #undef FIX_CAMERAMODES
  925. #define FIX_CAMERAMODES (2)
  926. #endif
  927. #if !defined FIX_DriveBy
  928. #define FIX_DriveBy (1)
  929. #elseif _FIXES_IS_UNSET(FIX_DriveBy)
  930. #undef FIX_DriveBy
  931. #define FIX_DriveBy (2)
  932. #endif
  933. #if !defined FIX_SetPlayerCheckpoint
  934. #define FIX_SetPlayerCheckpoint (1)
  935. #elseif _FIXES_IS_UNSET(FIX_SetPlayerCheckpoint)
  936. #undef FIX_SetPlayerCheckpoint
  937. #define FIX_SetPlayerCheckpoint (2)
  938. #endif
  939. #if !defined FIX_SetPlayerRaceCheckpoint
  940. #define FIX_SetPlayerRaceCheckpoint (1)
  941. #elseif _FIXES_IS_UNSET(FIX_SetPlayerRaceCheckpoint)
  942. #undef FIX_SetPlayerRaceCheckpoint
  943. #define FIX_SetPlayerRaceCheckpoint (2)
  944. #endif
  945. #if !defined FIX_TextDrawCreate
  946. #define FIX_TextDrawCreate (1)
  947. #elseif _FIXES_IS_UNSET(FIX_TextDrawCreate)
  948. #undef FIX_TextDrawCreate
  949. #define FIX_TextDrawCreate (2)
  950. #endif
  951. #if !defined FIX_TextDrawSetString
  952. #define FIX_TextDrawSetString (1)
  953. #elseif _FIXES_IS_UNSET(FIX_TextDrawSetString)
  954. #undef FIX_TextDrawSetString
  955. #define FIX_TextDrawSetString (2)
  956. #endif
  957. #if !defined FIX_AllowInteriorWeapons
  958. #define FIX_AllowInteriorWeapons (1)
  959. #elseif _FIXES_IS_UNSET(FIX_AllowInteriorWeapons)
  960. #undef FIX_AllowInteriorWeapons
  961. #define FIX_AllowInteriorWeapons (2)
  962. #endif
  963. #if !defined FIX_OnPlayerEnterVehicle
  964. #if defined OnPlayerClickMap
  965. #define FIX_OnPlayerEnterVehicle (0)
  966. #else
  967. #define FIX_OnPlayerEnterVehicle (1)
  968. #endif
  969. #elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle)
  970. #undef FIX_OnPlayerEnterVehicle
  971. #define FIX_OnPlayerEnterVehicle (2)
  972. #endif
  973. #if !defined FIX_OnPlayerEnterVehicle_2
  974. #define FIX_OnPlayerEnterVehicle_2 (1)
  975. #elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle)
  976. #undef FIX_OnPlayerEnterVehicle_2
  977. #define FIX_OnPlayerEnterVehicle_2 (2)
  978. #endif
  979. #if !defined FIX_AllowTeleport
  980. #if defined OnPlayerClickMap
  981. #define FIX_AllowTeleport (1)
  982. #else
  983. #define FIX_AllowTeleport (0)
  984. #endif
  985. #elseif _FIXES_IS_UNSET(FIX_AllowTeleport)
  986. #undef FIX_AllowTeleport
  987. #define FIX_AllowTeleport (2)
  988. #endif
  989. #if !defined FIX_SetPlayerSpecialAction
  990. #define FIX_SetPlayerSpecialAction (1)
  991. #elseif _FIXES_IS_UNSET(FIX_SetPlayerSpecialAction)
  992. #undef FIX_SetPlayerSpecialAction
  993. #define FIX_SetPlayerSpecialAction (2)
  994. #endif
  995. #if !defined FIX_ClearAnimations
  996. #define FIX_ClearAnimations (1)
  997. #elseif _FIXES_IS_UNSET(FIX_ClearAnimations)
  998. #undef FIX_ClearAnimations
  999. #define FIX_ClearAnimations (2)
  1000. #endif
  1001. #if !defined FIX_ClearAnimations_2
  1002. #define FIX_ClearAnimations_2 (1)
  1003. #elseif _FIXES_IS_UNSET(FIX_ClearAnimations_2)
  1004. #undef FIX_ClearAnimations_2
  1005. #define FIX_ClearAnimations_2 (2)
  1006. #endif
  1007. #if !defined FIX_GangZoneCreate
  1008. #define FIX_GangZoneCreate (1)
  1009. #elseif _FIXES_IS_UNSET(FIX_GangZoneCreate)
  1010. #undef FIX_GangZoneCreate
  1011. #define FIX_GangZoneCreate (2)
  1012. #endif
  1013. #if !defined FIX_OnDialogResponse
  1014. #if defined GetVehicleModelInfo
  1015. #define FIX_OnDialogResponse (0)
  1016. #else
  1017. #define FIX_OnDialogResponse (1)
  1018. #endif
  1019. #elseif _FIXES_IS_UNSET(FIX_OnDialogResponse)
  1020. #undef FIX_OnDialogResponse
  1021. #define FIX_OnDialogResponse (2)
  1022. #endif
  1023. #if !defined FIX_GetPlayerDialog
  1024. #define FIX_GetPlayerDialog (0)
  1025. #elseif _FIXES_IS_UNSET(FIX_GetPlayerDialog)
  1026. #undef FIX_GetPlayerDialog
  1027. #define FIX_GetPlayerDialog (2)
  1028. #endif
  1029. #if !defined FIX_PlayerDialogResponse
  1030. #define FIX_PlayerDialogResponse (1)
  1031. #elseif _FIXES_IS_UNSET(FIX_PlayerDialogResponse)
  1032. #undef FIX_PlayerDialogResponse
  1033. #define FIX_PlayerDialogResponse (2)
  1034. #endif
  1035. #if !defined FIX_SetSpawnInfo
  1036. #if defined GetPlayerVersion
  1037. #define FIX_SetSpawnInfo (0)
  1038. #else
  1039. #define FIX_SetSpawnInfo (1)
  1040. #endif
  1041. #elseif _FIXES_IS_UNSET(FIX_SetSpawnInfo)
  1042. #undef FIX_SetSpawnInfo
  1043. #define FIX_SetSpawnInfo (2)
  1044. #endif
  1045. #if !defined FIX_SetPlayerSkin
  1046. #define FIX_SetPlayerSkin (1)
  1047. #elseif _FIXES_IS_UNSET(FIX_SetPlayerSkin)
  1048. #undef FIX_SetPlayerSkin
  1049. #define FIX_SetPlayerSkin (2)
  1050. #endif
  1051. #if !defined FIX_HideMenuForPlayer
  1052. #define FIX_HideMenuForPlayer (1)
  1053. #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer)
  1054. #undef FIX_HideMenuForPlayer
  1055. #define FIX_HideMenuForPlayer (2)
  1056. #endif
  1057. #if !defined FIX_valstr
  1058. #define FIX_valstr (1)
  1059. #elseif _FIXES_IS_UNSET(FIX_valstr)
  1060. #undef FIX_valstr
  1061. #define FIX_valstr (2)
  1062. #endif
  1063. #if !defined FIX_file_inc
  1064. #define FIX_file_inc (0)
  1065. #elseif _FIXES_IS_UNSET(FIX_file_inc)
  1066. #undef FIX_file_inc
  1067. #define FIX_file_inc (2)
  1068. #endif
  1069. #if !defined FIX_fclose
  1070. #define FIX_fclose (FIX_file_inc)
  1071. #elseif _FIXES_IS_UNSET(FIX_fclose)
  1072. #undef FIX_fclose
  1073. #define FIX_fclose (2)
  1074. #endif
  1075. #if !defined FIX_fwrite
  1076. #define FIX_fwrite (FIX_file_inc)
  1077. #elseif _FIXES_IS_UNSET(FIX_fwrite)
  1078. #undef FIX_fwrite
  1079. #define FIX_fwrite (2)
  1080. #endif
  1081. #if !defined FIX_fread
  1082. #define FIX_fread (FIX_file_inc)
  1083. #elseif _FIXES_IS_UNSET(FIX_fread)
  1084. #undef FIX_fread
  1085. #define FIX_fread (2)
  1086. #endif
  1087. #if !defined FIX_fputchar
  1088. #define FIX_fputchar (FIX_file_inc)
  1089. #elseif _FIXES_IS_UNSET(FIX_fputchar)
  1090. #undef FIX_fputchar
  1091. #define FIX_fputchar (2)
  1092. #endif
  1093. #if !defined FIX_fgetchar
  1094. #define FIX_fgetchar (FIX_file_inc)
  1095. #elseif _FIXES_IS_UNSET(FIX_fgetchar)
  1096. #undef FIX_fgetchar
  1097. #define FIX_fgetchar (2)
  1098. #endif
  1099. #if !defined FIX_fblockwrite
  1100. #define FIX_fblockwrite (FIX_file_inc)
  1101. #elseif _FIXES_IS_UNSET(FIX_fblockwrite)
  1102. #undef FIX_fblockwrite
  1103. #define FIX_fblockwrite (2)
  1104. #endif
  1105. #if !defined FIX_fblockread
  1106. #define FIX_fblockread (FIX_file_inc)
  1107. #elseif _FIXES_IS_UNSET(FIX_fblockread)
  1108. #undef FIX_fblockread
  1109. #define FIX_fblockread (2)
  1110. #endif
  1111. #if !defined FIX_fseek
  1112. #define FIX_fseek (FIX_file_inc)
  1113. #elseif _FIXES_IS_UNSET(FIX_fseek)
  1114. #undef FIX_fseek
  1115. #define FIX_fseek (2)
  1116. #endif
  1117. #if !defined FIX_flength
  1118. #define FIX_flength (FIX_file_inc)
  1119. #elseif _FIXES_IS_UNSET(FIX_flength)
  1120. #undef FIX_flength
  1121. #define FIX_flength (2)
  1122. #endif
  1123. #if !defined FIX_IsPlayerAttachedObjSlotUsed
  1124. #define FIX_IsPlayerAttachedObjSlotUsed (1)
  1125. #elseif _FIXES_IS_UNSET(FIX_IsPlayerAttachedObjSlotUsed)
  1126. #undef FIX_IsPlayerAttachedObjSlotUsed
  1127. #define FIX_IsPlayerAttachedObjSlotUsed (2)
  1128. #endif
  1129. #if !defined FIX_SetPlayerAttachedObject
  1130. #define FIX_SetPlayerAttachedObject (1)
  1131. #elseif _FIXES_IS_UNSET(FIX_SetPlayerAttachedObject)
  1132. #undef FIX_SetPlayerAttachedObject
  1133. #define FIX_SetPlayerAttachedObject (2)
  1134. #endif
  1135. #if !defined FIX_OnPlayerDeath
  1136. #define FIX_OnPlayerDeath (1)
  1137. #elseif _FIXES_IS_UNSET(FIX_OnPlayerDeath)
  1138. #undef FIX_OnPlayerDeath
  1139. #define FIX_OnPlayerDeath (2)
  1140. #endif
  1141. #if !defined FIX_strins
  1142. #define FIX_strins (1)
  1143. #elseif _FIXES_IS_UNSET(FIX_strins)
  1144. #undef FIX_strins
  1145. #define FIX_strins (2)
  1146. #endif
  1147. #if !defined FIX_IsPlayerConnected
  1148. #define FIX_IsPlayerConnected (1)
  1149. #elseif _FIXES_IS_UNSET(FIX_IsPlayerConnected)
  1150. #undef FIX_IsPlayerConnected
  1151. #define FIX_IsPlayerConnected (2)
  1152. #endif
  1153. #if !defined FIX_OnPlayerCommandText
  1154. #define FIX_OnPlayerCommandText (1)
  1155. #elseif _FIXES_IS_UNSET(FIX_OnPlayerCommandText)
  1156. #undef FIX_OnPlayerCommandText
  1157. #define FIX_OnPlayerCommandText (2)
  1158. #endif
  1159. #if !defined FIX_TrainExit
  1160. #define FIX_TrainExit (1)
  1161. #elseif _FIXES_IS_UNSET(FIX_TrainExit)
  1162. #undef FIX_TrainExit
  1163. #define FIX_TrainExit (2)
  1164. #endif
  1165. #if !defined FIX_Kick
  1166. #if defined EnableVehicleFriendlyFire
  1167. #define FIX_Kick (0)
  1168. #else
  1169. #define FIX_Kick (1)
  1170. #endif
  1171. #elseif _FIXES_IS_UNSET(FIX_Kick)
  1172. #undef FIX_Kick
  1173. #define FIX_Kick (2)
  1174. #endif
  1175. #if !defined FIX_OnVehicleMod
  1176. #define FIX_OnVehicleMod (1)
  1177. #elseif _FIXES_IS_UNSET(FIX_OnVehicleMod)
  1178. #undef FIX_OnVehicleMod
  1179. #define FIX_OnVehicleMod (2)
  1180. #endif
  1181. #if !defined FIX_random
  1182. #define FIX_random (0)
  1183. #elseif _FIXES_IS_UNSET(FIX_random)
  1184. #undef FIX_random
  1185. #define FIX_random (2)
  1186. #endif
  1187. #if !defined FIX_sleep
  1188. #define FIX_sleep (1)
  1189. #elseif _FIXES_IS_UNSET(FIX_sleep)
  1190. #undef FIX_sleep
  1191. #define FIX_sleep (2)
  1192. #endif
  1193. #if !defined FIX_Menus
  1194. #define FIX_Menus (1)
  1195. #elseif _FIXES_IS_UNSET(FIX_Menus)
  1196. #undef FIX_Menus
  1197. #define FIX_Menus (2)
  1198. #endif
  1199. #if !defined FIX_AddMenuItem
  1200. #define FIX_AddMenuItem (FIX_Menus)
  1201. #elseif _FIXES_IS_UNSET(FIX_AddMenuItem)
  1202. #undef FIX_AddMenuItem
  1203. #define FIX_AddMenuItem (2)
  1204. #endif
  1205. #if !defined FIX_SetMenuColumnHeader
  1206. #define FIX_SetMenuColumnHeader (FIX_Menus)
  1207. #elseif _FIXES_IS_UNSET(FIX_SetMenuColumnHeader)
  1208. #undef FIX_SetMenuColumnHeader
  1209. #define FIX_SetMenuColumnHeader (2)
  1210. #endif
  1211. #if !defined FIX_ShowMenuForPlayer
  1212. #define FIX_ShowMenuForPlayer (FIX_Menus)
  1213. #elseif _FIXES_IS_UNSET(FIX_ShowMenuForPlayer)
  1214. #undef FIX_ShowMenuForPlayer
  1215. #define FIX_ShowMenuForPlayer (2)
  1216. #endif
  1217. #if !defined FIX_HideMenuForPlayer
  1218. #define FIX_HideMenuForPlayer (FIX_Menus)
  1219. #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer)
  1220. #undef FIX_HideMenuForPlayer
  1221. #define FIX_HideMenuForPlayer (2)
  1222. #endif
  1223. #if !defined FIX_GetPlayerMenu
  1224. #define FIX_GetPlayerMenu (1)
  1225. #elseif _FIXES_IS_UNSET(FIX_GetPlayerMenu)
  1226. #undef FIX_GetPlayerMenu
  1227. #define FIX_GetPlayerMenu (2)
  1228. #endif
  1229. #if !defined FIX_HideMenuForPlayer_2
  1230. #define FIX_HideMenuForPlayer_2 (0)
  1231. #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer_2)
  1232. #undef FIX_HideMenuForPlayer_2
  1233. #define FIX_HideMenuForPlayer_2 (2)
  1234. #elseif FIX_HideMenuForPlayer_2 && !FIX_GetPlayerMenu
  1235. #error FIX_HideMenuForPlayer_2 requires FIX_GetPlayerMenu
  1236. #endif
  1237. #if !defined FIX_DisableMenu
  1238. #define FIX_DisableMenu (FIX_Menus)
  1239. #elseif _FIXES_IS_UNSET(FIX_DisableMenu)
  1240. #undef FIX_DisableMenu
  1241. #define FIX_DisableMenu (2)
  1242. #endif
  1243. #if !defined FIX_DisableMenuRow
  1244. #define FIX_DisableMenuRow (FIX_Menus)
  1245. #elseif _FIXES_IS_UNSET(FIX_DisableMenuRow)
  1246. #undef FIX_DisableMenuRow
  1247. #define FIX_DisableMenuRow (2)
  1248. #endif
  1249. #if FIX_Menus || FIX_AddMenuItem || FIX_SetMenuColumnHeader || FIX_ShowMenuForPlayer || FIX_HideMenuForPlayer || FIX_DisableMenu || FIX_DisableMenuRow
  1250. #define _FIX_Menus (1)
  1251. #else
  1252. #define _FIX_Menus (2)
  1253. #endif
  1254. #if !defined FIX_GetPlayerInterior
  1255. #define FIX_GetPlayerInterior (1)
  1256. #elseif _FIXES_IS_UNSET(FIX_GetPlayerInterior)
  1257. #undef FIX_GetPlayerInterior
  1258. #define FIX_GetPlayerInterior (2)
  1259. #endif
  1260. #if !defined FIX_ApplyAnimation
  1261. #define FIX_ApplyAnimation (1)
  1262. #elseif _FIXES_IS_UNSET(FIX_ApplyAnimation)
  1263. #undef FIX_ApplyAnimation
  1264. #define FIX_ApplyAnimation (2)
  1265. #endif
  1266. #if !defined FIX_ApplyAnimation_2
  1267. #define FIX_ApplyAnimation_2 (1)
  1268. #elseif _FIXES_IS_UNSET(FIX_ApplyAnimation_2)
  1269. #undef FIX_ApplyAnimation_2
  1270. #define FIX_ApplyAnimation_2 (2)
  1271. #endif
  1272. #if !defined FIX_OnPlayerSpawn
  1273. #define FIX_OnPlayerSpawn (1)
  1274. #elseif _FIXES_IS_UNSET(FIX_OnPlayerSpawn)
  1275. #undef FIX_OnPlayerSpawn
  1276. #define FIX_OnPlayerSpawn (2)
  1277. #endif
  1278. #if !defined FIX_GameText
  1279. #define FIX_GameText (1)
  1280. #elseif _FIXES_IS_UNSET(FIX_GameText)
  1281. #undef FIX_GameText
  1282. #define FIX_GameText (2)
  1283. #endif
  1284. #if !defined FIX_HideGameText
  1285. #define FIX_HideGameText (0)
  1286. #elseif _FIXES_IS_UNSET(FIX_HideGameText)
  1287. #undef FIX_HideGameText
  1288. #define FIX_HideGameText (2)
  1289. #endif
  1290. #if !defined FIX_GameTextStyles
  1291. #define FIX_GameTextStyles (0)
  1292. #elseif _FIXES_IS_UNSET(FIX_GameTextStyles)
  1293. #undef FIX_GameTextStyles
  1294. #define FIX_GameTextStyles (2)
  1295. #elseif FIX_GameTextStyles && !FIX_GameText
  1296. #error FIX_GameTextStyles requires FIX_GameText
  1297. #endif
  1298. #if !defined FIX_OnPlayerConnect
  1299. #define FIX_OnPlayerConnect (1)
  1300. #elseif _FIXES_IS_UNSET(FIX_OnPlayerConnect)
  1301. #undef FIX_OnPlayerConnect
  1302. #define FIX_OnPlayerConnect (2)
  1303. #endif
  1304. #if !defined FIX_OnPlayerDisconnect
  1305. #define FIX_OnPlayerDisconnect (1)
  1306. #elseif _FIXES_IS_UNSET(FIX_OnPlayerDisconnect)
  1307. #undef FIX_OnPlayerDisconnect
  1308. #define FIX_OnPlayerDisconnect (2)
  1309. #endif
  1310. #if !defined FIX_CreatePlayerTextDraw
  1311. #define FIX_CreatePlayerTextDraw (1)
  1312. #elseif _FIXES_IS_UNSET(FIX_CreatePlayerTextDraw)
  1313. #undef FIX_CreatePlayerTextDraw
  1314. #define FIX_CreatePlayerTextDraw (2)
  1315. #endif
  1316. #if !defined FIX_PlayerTextDrawSetString
  1317. #define FIX_PlayerTextDrawSetString (1)
  1318. #elseif _FIXES_IS_UNSET(FIX_PlayerTextDrawSetString)
  1319. #undef FIX_PlayerTextDrawSetString
  1320. #define FIX_PlayerTextDrawSetString (2)
  1321. #endif
  1322. #if !defined FIX_SetPlayerCamera
  1323. #define FIX_SetPlayerCamera (1)
  1324. #elseif _FIXES_IS_UNSET(FIX_SetPlayerCamera)
  1325. #undef FIX_SetPlayerCamera
  1326. #define FIX_SetPlayerCamera (2)
  1327. #endif
  1328. #if !defined FIX_SetPlayerTime
  1329. #define FIX_SetPlayerTime (1)
  1330. #elseif _FIXES_IS_UNSET(FIX_SetPlayerTime)
  1331. #undef FIX_SetPlayerTime
  1332. #define FIX_SetPlayerTime (2)
  1333. #endif
  1334. #if !defined FIX_OnPlayerRequestClass
  1335. #define FIX_OnPlayerRequestClass (1)
  1336. #elseif _FIXES_IS_UNSET(FIX_OnPlayerRequestClass)
  1337. #undef FIX_OnPlayerRequestClass
  1338. #define FIX_OnPlayerRequestClass (2)
  1339. #endif
  1340. /*
  1341. * CHAIN_ORDER
  1342. *
  1343. * Allows y_hooks to call things in the correct order when it exists.
  1344. */
  1345. #if !defined CHAIN_ORDER
  1346. #define CHAIN_ORDER() 0
  1347. #endif
  1348. /*
  1349. * PRE_HOOK
  1350. *
  1351. * A method of pre-hooking callbacks to still have them called before any ones
  1352. * re-written by y_hooks.
  1353. */
  1354. #define PRE_HOOK(%0) forward @CO_%0();public @CO_%0(){return CHAIN_ORDER()+1;}
  1355. PRE_HOOK(FIXES)
  1356. #undef CHAIN_ORDER
  1357. #define CHAIN_ORDER @CO_FIXES
  1358. /*
  1359. * _FIXES_IncludeStates
  1360. *
  1361. * Define the "_ALS" states used by hooks.
  1362. */
  1363. static stock _FIXES_IncludeStates() <_ALS : _ALS_x0, _ALS : _ALS_x1, _ALS : _ALS_x2, _ALS : _ALS_x3>
  1364. {
  1365. }
  1366. static stock _FIXES_IncludeStates() <_ALS : _ALS_go>
  1367. {
  1368. }
  1369. /*
  1370. * FIXES_GT_STYLE_COUNT
  1371. *
  1372. * The number of GameText styles recreated using TextDraw functions. This is 4
  1373. * by default, but can be extended to 6 if you want location and vehicle styles.
  1374. */
  1375. #if FIX_GameText
  1376. #if FIX_GameTextStyles
  1377. #define FIXES_GT_STYLE_COUNT (14)
  1378. #else
  1379. #define FIXES_GT_STYLE_COUNT (7)
  1380. #endif
  1381. #endif
  1382. /*
  1383. * FIXES_SilentKick
  1384. *
  1385. * If this define is set to 1, then players will not be given a message when
  1386. * they are kicked for cheats, instead they will just loose connection to the
  1387. * server.
  1388. */
  1389. #if !defined FIXES_SilentKick
  1390. #define FIXES_SilentKick 0
  1391. #elseif _FIXES_IS_UNSET(FIXES_SilentKick)
  1392. #undef FIXES_SilentKick
  1393. #define FIXES_SilentKick 2
  1394. #endif
  1395. /*
  1396. * FIXES_Debug
  1397. *
  1398. * If this define is set to 1, then debug printing is turned on for any
  1399. * functions which may use it. Otherwise, the compiler entirely removes the
  1400. * code to print anything, leaving 0 run-time overhead.
  1401. */
  1402. #if defined FIXES_Debug
  1403. #if _FIXES_IS_UNSET(FIXES_Debug)
  1404. #undef FIXES_Debug
  1405. #elseif FIXES_Debug == 1
  1406. #define FIXES_PRINTF(%0); print(_FIXES_gIsFilterscript ? ("* FIXES_PRINTF (FS):") : ("* FIXES_PRINTF (GM):")),printf("*** " %0);
  1407. #else
  1408. #undef FIXES_Debug
  1409. #endif
  1410. #endif
  1411. /*
  1412. * FIXES_UseStateHooks
  1413. *
  1414. * A marker to indicate that this version of fixes.inc uses state-based hooks.
  1415. */
  1416. #define FIXES_UseStateHooks
  1417. /*
  1418. * FIXES_PRINTF
  1419. *
  1420. * A special "printf" function only compiled when "FIXES_Debug" is set.
  1421. */
  1422. #if !defined FIXES_PRINTF
  1423. #define FIXES_Debug 0
  1424. #define FIXES_PRINTF(%0);
  1425. #endif
  1426. /*
  1427. * INVALID_DIALOG_ID
  1428. *
  1429. * Set when a player can't see a dialog.
  1430. */
  1431. #if !defined INVALID_DIALOG_ID
  1432. #define INVALID_DIALOG_ID (-1)
  1433. #endif
  1434. /*
  1435. * FIXES_Single
  1436. *
  1437. * If this define is set to 1, then the old style include is used, with no
  1438. * support for multiple scripts running at the same time on the server (i.e. no
  1439. * gamemodes and filter scripts at the same time). You can only have one or the
  1440. * other or bugs.
  1441. */
  1442. #if !defined FIXES_Single
  1443. #define FIXES_Single (1)
  1444. #elseif _FIXES_IS_UNSET(FIXES_Single)
  1445. #undef FIXES_Single
  1446. #define FIXES_Single (2)
  1447. #endif
  1448. /*
  1449. * _FIXES_IS_IN_CHARGE
  1450. *
  1451. * Test to see if this script is in command or not (master).
  1452. */
  1453. #if FIXES_Single
  1454. #define _FIXES_IS_IN_CHARGE(%0)
  1455. #else
  1456. #define _FIXES_IS_IN_CHARGE(%0) if (%0(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
  1457. #endif
  1458. /*
  1459. * E_FIXES_WORLDBOUND_DATA
  1460. *
  1461. * Store data for each player on their worldbound data.
  1462. */
  1463. enum E_FIXES_WORLDBOUND_DATA
  1464. {
  1465. // "Previous".
  1466. Float:E_FIXES_WORLDBOUND_DATA_PX,
  1467. Float:E_FIXES_WORLDBOUND_DATA_PY,
  1468. Float:E_FIXES_WORLDBOUND_DATA_PZ,
  1469. // "Lower".
  1470. Float:E_FIXES_WORLDBOUND_DATA_LX,
  1471. Float:E_FIXES_WORLDBOUND_DATA_LY,
  1472. // "Upper".
  1473. Float:E_FIXES_WORLDBOUND_DATA_UX,
  1474. Float:E_FIXES_WORLDBOUND_DATA_UY
  1475. }
  1476. /*
  1477. * e_FIXES_BOOLS
  1478. *
  1479. * Collection of boolean values for players, designed to collect multiple checks
  1480. * in to one variable to reduce memory consumption.
  1481. */
  1482. enum e_FIXES_BOOLS (<<= 1)
  1483. {
  1484. // Handy definition for nothing set.
  1485. e_FIXES_BOOLS_NONE = 0,
  1486. // Does this player have worldbounds enabled?
  1487. e_FIXES_BOOLS_WORLDBOUNDS = 1,
  1488. e_FIXES_BOOLS_UNCONTROLLABLE,
  1489. e_FIXES_BOOLS_PUT_IN_VEHICLE,
  1490. e_FIXES_BOOLS_BLOCK,
  1491. e_FIXES_BOOLS_TELEPORT,
  1492. e_FIXES_BOOLS_CONNECTED,
  1493. e_FIXES_BOOLS_INTERIOR,
  1494. e_FIXES_BOOLS_PUT_IN_TRAIN,
  1495. e_FIXES_BOOLS_KICKED,
  1496. e_FIXES_BOOLS_ON_PLAYER_CONNECT,
  1497. e_FIXES_BOOLS_DRIVE_BY,
  1498. e_FIXES_BOOLS_FIRST_SPAWN,
  1499. e_FIXES_BOOLS_FIRST_CLASS,
  1500. e_FIXES_BOOLS_SPECTATING
  1501. }
  1502. /*
  1503. * e_FIXES_SETTINGS
  1504. *
  1505. * Collection of boolean values for the script as a whole. Stores a variety of
  1506. * settings that are true/false.
  1507. */
  1508. enum e_FIXES_SETTINGS (<<= 1)
  1509. {
  1510. // Handy definition for nothing set.
  1511. e_FIXES_SETTINGS_NONE = 0,
  1512. e_FIXES_SETTINGS_INTERIOR = 1,
  1513. e_FIXES_SETTINGS_ADMIN_TELEPORT,
  1514. e_FIXES_SETTINGS_IN_CHARGE,
  1515. e_FIXES_SETTINGS_DROP_ALL_DATA,
  1516. e_FIXES_SETTINGS_MENU_SET,
  1517. e_FIXES_SETTINGS_ENDING,
  1518. e_FIXES_SETTINGS_ENDED,
  1519. e_FIXES_SETTINGS_NO_GAME_TEXT,
  1520. e_FIXES_SETTINGS_SECOND_USE
  1521. }
  1522. /*
  1523. * _FIXES_CEILDIV
  1524. *
  1525. * Do a ceiling division of the first number by the second number.
  1526. */
  1527. #define _FIXES_CEILDIV(%0,%1) (((%0) + (%1) - 1) / (%1))
  1528. /*
  1529. * _FIXES_INFINITY
  1530. *
  1531. * IEEE 754 definition of infinity.
  1532. */
  1533. #define _FIXES_INFINITY (Float:0x7F800000)
  1534. /*
  1535. * _FIXES_N_INFINITY
  1536. *
  1537. * IEEE 754 definition of negative infinity.
  1538. */
  1539. #define _FIXES_N_INFINITY (Float:0xFF800000)
  1540. /*
  1541. * _FIXES_ATTACHMENTS
  1542. *
  1543. * The number of players whose attachment data (10-bits) can be stored in one
  1544. * cell.
  1545. */
  1546. #define _FIXES_ATTACHMENTS (cellbits / MAX_PLAYER_ATTACHED_OBJECTS)
  1547. /*
  1548. * _FIXES_FOREACH
  1549. *
  1550. * A new version of "foreach", but just for this library.
  1551. */
  1552. #define _FIXES_FOREACH(%1,%0) for (new %0 = MAX_PLAYERS; (%0 = %1[%0]) != MAX_PLAYERS; )
  1553. /*
  1554. * _FIXES_IN_RANGE
  1555. *
  1556. * Checks if the first parameter is between the other two: %1 <= %0 < %2 (but
  1557. * faster).
  1558. */
  1559. #define _FIXES_IN_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) < ((%2) - ((%1) + cellmin)))
  1560. /*
  1561. * _FIXES_NO_RANGE
  1562. *
  1563. * Checks if the first parameter is not between the other two: !(%1 <= %0 < %2)
  1564. * (but faster).
  1565. */
  1566. #define _FIXES_NO_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) >= ((%2) - ((%1) + cellmin)))
  1567. /*
  1568. * _FIXES_FORWARD
  1569. *
  1570. * Forwards a hooked callbacks, and defines the default state implementations.
  1571. */
  1572. #define _FIXES_FORWARD%0(%1); \
  1573. forward%0(%1); \
  1574. public%0(%1) <_ALS : _ALS_x0, _ALS : _ALS_x1> { return 1; } \
  1575. public%0(%1) <> { return 1; }
  1576. /*
  1577. * _FIXES_IS_PLAYER_CONNECTED
  1578. *
  1579. * Always valid "IsPlayerConnected" check.
  1580. */
  1581. #define _FIXES_IS_PLAYER_CONNECTED(%0) (_FIXES_IN_RANGE((%0), 0, MAX_PLAYERS) && IsPlayerConnected((%0)))
  1582. // These varaibles are NOT pre-processor dependent as they are stock. It's just
  1583. // simpler than trying to figure out when or if a semi-colon is needed.
  1584. #if !FIX_FILTERSCRIPT
  1585. static
  1586. #endif
  1587. stock
  1588. /*
  1589. * bool:_FIXES_gIsFilterscript
  1590. *
  1591. * Runtime equivalent of "FILTERSCRIPT" for when it is not set by the user.
  1592. */
  1593. bool:_FIXES_gIsFilterscript;
  1594. stock
  1595. /*
  1596. * FIXES_gscSpace[]
  1597. *
  1598. * A single re-usable space.
  1599. */
  1600. FIXES_gscSpace[] = " ";
  1601. #if FIXES_Debug
  1602. new
  1603. #else
  1604. static stock
  1605. #endif
  1606. /*
  1607. * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)]
  1608. *
  1609. * A record of which menus have and haven't been shown yet. We ensure that
  1610. * this only exists when required, since it depends on add and remove
  1611. * functions to be called at the right time.
  1612. */
  1613. #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  1614. FIXES_gsPlayersIterator[MAX_PLAYERS + 1] = {0, 1, ...},
  1615. #endif
  1616. /*
  1617. * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)]
  1618. *
  1619. * A record of which menus have and haven't been shown yet.
  1620. */
  1621. FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)],
  1622. /*
  1623. * FIXES_gsPlayerIP[MAX_PLAYERS]
  1624. *
  1625. * A player's IP as a 32-bit integer.
  1626. */
  1627. FIXES_gsPlayerIP[MAX_PLAYERS] = {-1, ...},
  1628. /*
  1629. * FIXES_gsPlayerSkin[MAX_PLAYERS]
  1630. *
  1631. * The skin the player is currently using.
  1632. */
  1633. FIXES_gsPlayerSkin[MAX_PLAYERS],
  1634. /*
  1635. * e_FIXES_BOOLEAN_DATA:FIXES_gsPlayerBools[MAX_PLAYERS]
  1636. *
  1637. * Collection of boolean values for players.
  1638. */
  1639. e_FIXES_BOOLS:FIXES_gsPlayerBools[MAX_PLAYERS],
  1640. /*
  1641. * FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA]
  1642. *
  1643. * All data for players on where their worldbounds are and where they last
  1644. * were before they went through the bounds by crouching.
  1645. */
  1646. #if FIX_SetPlayerWorldBounds
  1647. FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA],
  1648. #endif
  1649. /*
  1650. * FIXES_gsPlayerWeapon[MAX_PLAYERS]
  1651. *
  1652. * Stores the weapon set by "SetPlayerArmedWeapon" when in a vehicle.
  1653. */
  1654. FIXES_gsPlayerWeapon[MAX_PLAYERS],
  1655. /*
  1656. * FIXES_gsVehicleSeatData[MAX_PLAYERS]
  1657. *
  1658. * What vehicle the player is due to go in.
  1659. */
  1660. FIXES_gsVehicleSeatData[MAX_PLAYERS],
  1661. /*
  1662. * FIXES_gsVehicleLocked[(MAX_PLAYERS * MAX_VEHICLES + cellbits - 1) / cellbits]
  1663. *
  1664. * Is this vehicle locked for a player. This is a compressed 2D binary
  1665. * array, made by concatenating many bits together (saves 1kb-3kb)! Is
  1666. * there a reason this array exists?
  1667. */
  1668. //FIXES_gsVehicleLocked[_FIXES_CEILDIV(MAX_PLAYERS * MAX_VEHICLES, cellbits)],
  1669. /*
  1670. * FIXES_gsDialogID[MAX_PLAYERS]
  1671. *
  1672. * Stores the true ID of the dialog the player is looking at to prevent
  1673. * spoofing.
  1674. */
  1675. FIXES_gsDialogID[MAX_PLAYERS] = {-1, ...},
  1676. /*
  1677. * FIXES_gsInterior[MAX_PLAYERS]
  1678. *
  1679. * The player's current interior.
  1680. */
  1681. FIXES_gsInterior[MAX_PLAYERS],
  1682. /*
  1683. * e_FIXES_SETTINGS:FIXES_gsSettings
  1684. *
  1685. * A collection of 1-bit options, compressed together to save space.
  1686. */
  1687. e_FIXES_SETTINGS:FIXES_gsSettings = e_FIXES_SETTINGS_SECOND_USE,
  1688. /*
  1689. * FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)]
  1690. *
  1691. * A record of which attached object slots a player has used.
  1692. */
  1693. FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)],
  1694. /*
  1695. * FIXES_gsLastAnimation[MAX_PLAYERS]
  1696. *
  1697. * The last animation a player used.
  1698. */
  1699. FIXES_gsLastAnimation[MAX_PLAYERS],
  1700. /*
  1701. * FIXES_gsLastCash[MAX_PLAYERS]
  1702. *
  1703. * A player's cash before dying.
  1704. */
  1705. FIXES_gsLastCash[MAX_PLAYERS],
  1706. /*
  1707. * FIXES_gsDriveByWeapon[MAX_PLAYERS]
  1708. *
  1709. * The weapon to set after re-enter to vehicle.
  1710. */
  1711. FIXES_gsDriveByWeapon[MAX_PLAYERS],
  1712. /*
  1713. * FIXES_gsCurrentMenu[MAX_PLAYERS]
  1714. *
  1715. * The menu the player can currently see.
  1716. */
  1717. Menu:FIXES_gsCurrentMenu[MAX_PLAYERS] = {Menu:INVALID_MENU, ...},
  1718. /*
  1719. * Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT]
  1720. *
  1721. * The pre-defined TextDraw styles used to recreate the bugged GameText
  1722. * styles for GameTextForAll.
  1723. */
  1724. #if FIX_GameText
  1725. Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT],
  1726. #endif
  1727. /*
  1728. * FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1]
  1729. *
  1730. * A linked list of which players can see a certain GameText style.
  1731. */
  1732. #if FIX_GameText
  1733. FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1],
  1734. #endif
  1735. /*
  1736. * PlayerText:FIXES_gsPGTStyle[FIXES_GT_STYLE_COUNT][MAX_PLAYERS]
  1737. *
  1738. * The predefined TextDraw styles used to recreate the bugged GameText
  1739. * styles for GameTextForPlayer.
  1740. */
  1741. #if FIX_GameText
  1742. PlayerText:FIXES_gsPGTStyle[MAX_PLAYERS][FIXES_GT_STYLE_COUNT],
  1743. #endif
  1744. /*
  1745. * FIXES_gsPGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS]
  1746. *
  1747. * The timers used to hide per-player GameText messages.
  1748. */
  1749. #if FIX_GameText
  1750. FIXES_gsGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1],
  1751. #endif
  1752. /*
  1753. * FIXES_gsClassAnimTimer[MAX_PLAYERS],
  1754. *
  1755. * Used for storing the timer ID for deferring class selection animation
  1756. * application.
  1757. */
  1758. FIXES_gsAnimTimer[MAX_PLAYERS],
  1759. /*
  1760. * FIXES_gsClassAnimName[MAX_PLAYERS][60],
  1761. *
  1762. * Used for storing the animation name.
  1763. */
  1764. #if FIX_ApplyAnimation_2
  1765. FIXES_gsClassAnimName[MAX_PLAYERS][60],
  1766. #endif
  1767. /*
  1768. * FIXES_gsPlayerAnimLibs[MAX_PLAYERS][_FIXES_CEILDIV(134, cellbits)],
  1769. *
  1770. * Which animation libraries the player has synced.
  1771. */
  1772. #if FIX_ApplyAnimation_2
  1773. FIXES_gsPlayerAnimLibs[MAX_PLAYERS][_FIXES_CEILDIV(134, cellbits)],
  1774. #endif
  1775. /*
  1776. * FIXES_pvarNotNewPlayer[]
  1777. *
  1778. * This variable records wether or not this player is brand new to the
  1779. * server, and not just having "OnPlayerConnect" called due to a script
  1780. * load. There are certain functions that need applying only the very first
  1781. * time they connect, then this gets set.
  1782. */
  1783. FIXES_pvarNotNewPlayer[] = "FIXES_pvarNotNewPlayer",
  1784. /*
  1785. * FIXES_pvarPlayerWeapon[]
  1786. *
  1787. * Name of the pvar in which to store the player's current weapon.
  1788. */
  1789. FIXES_pvarPlayerWeapon[] = "FIXES_pvarPlayerWeapon",
  1790. /*
  1791. * FIXES_pvarPlayerSkin[]
  1792. *
  1793. * Name of the pvar in which to store the player's current skin.
  1794. */
  1795. FIXES_pvarPlayerSkin[] = "FIXES_pvarPlayerSkin",
  1796. /*
  1797. * FIXES_pvarPlayerSpectate[]
  1798. *
  1799. * Name of the pvar in which to store the player's spectator mode.
  1800. */
  1801. FIXES_pvarPlayerSpectate[] = "FIXES_pvarPlayerSpectate",
  1802. /*
  1803. * FIXES_gscKick[]
  1804. *
  1805. * Name of the kick timer function.
  1806. */
  1807. FIXES_gscKick[] = "_FIXES_Kick",
  1808. /*
  1809. * FIXES_pvarKick[]
  1810. *
  1811. * Name of the pvar in which to store a player's kick timer.
  1812. */
  1813. FIXES_pvarKick[] = "FIXES_pvarKick",
  1814. /*
  1815. * FIXES_pvarPlayerDialog[]
  1816. *
  1817. * Name of the pvar in which to store the player's current dialogid.
  1818. */
  1819. FIXES_pvarPlayerDialog[] = "FIXES_pvarPlayerDialog",
  1820. /*
  1821. * FIXES_pvarPlayerInterior[]
  1822. *
  1823. * A player's current interior.
  1824. */
  1825. FIXES_pvarPlayerInterior[] = "FIXES_pvarPlayerInterior",
  1826. /*
  1827. * FIXES_pvarCurrentDialog[]
  1828. *
  1829. * Used in OnDialogResponse to be able to get the correct ID in multiple
  1830. * scripts while still correctly resetting the ID for future use.
  1831. */
  1832. FIXES_pvarCurrentDialog[] = "FIXES_pvarCurrentDialog",
  1833. /*
  1834. * FIXES_pvarPlayerLastCash[]
  1835. *
  1836. * Used in OnPlayerDeath to save a player's cash before death.
  1837. */
  1838. FIXES_pvarPlayerLastCash[] = "FIXES_pvarPlayerLastCash",
  1839. /*
  1840. * FIXES_gscHideGameTextTimer[]
  1841. *
  1842. * Name of the GameText hide timer function.
  1843. */
  1844. FIXES_gscHideGameTextTimer[] = "_FIXES_HideGameTextTimer",
  1845. /*
  1846. * FIXES_gscDriveBy[]
  1847. *
  1848. * Name of the Drive-By timer function.
  1849. */
  1850. FIXES_gscDriveBy[] = "_FIXES_DriveBy",
  1851. /*
  1852. * FIXES_gscSetCamera[]
  1853. *
  1854. * Name of the SetCamera timer function.
  1855. */
  1856. FIXES_gscSetCamera[] = "_FIXES_SetCamera",
  1857. /*
  1858. * FIXES_gscSetTime[]
  1859. *
  1860. * Name of the SetTime timer function.
  1861. */
  1862. FIXES_gscSetTime[] = "_FIXES_SetTime",
  1863. /*
  1864. * FIXES_gscNULL[]
  1865. *
  1866. * NULL. This is stored as a global string to reduce memory usage.
  1867. */
  1868. FIXES_gscNULL[] = "\1";
  1869. static stock const
  1870. /*
  1871. * FIXES_gscPlayerColours[100]
  1872. *
  1873. * There are only 100 colours used by default, with SA:MP looping through
  1874. * them repeatedly.
  1875. */
  1876. #if FIX_GetPlayerColour
  1877. FIXES_gscPlayerColours[100] =
  1878. {
  1879. 0xFF8C13FF, 0xC715FFFF, 0x20B2AAFF, 0xDC143CFF, 0x6495EDFF,
  1880. 0xF0E68CFF, 0x778899FF, 0xFF1493FF, 0xF4A460FF, 0xEE82EEFF,
  1881. 0xFFD720FF, 0x8B4513FF, 0x4949A0FF, 0x148B8BFF, 0x14FF7FFF,
  1882. 0x556B2FFF, 0x0FD9FAFF, 0x10DC29FF, 0x534081FF, 0x0495CDFF,
  1883. 0xEF6CE8FF, 0xBD34DAFF, 0x247C1BFF, 0x0C8E5DFF, 0x635B03FF,
  1884. 0xCB7ED3FF, 0x65ADEBFF, 0x5C1ACCFF, 0xF2F853FF, 0x11F891FF,
  1885. 0x7B39AAFF, 0x53EB10FF, 0x54137DFF, 0x275222FF, 0xF09F5BFF,
  1886. 0x3D0A4FFF, 0x22F767FF, 0xD63034FF, 0x9A6980FF, 0xDFB935FF,
  1887. 0x3793FAFF, 0x90239DFF, 0xE9AB2FFF, 0xAF2FF3FF, 0x057F94FF,
  1888. 0xB98519FF, 0x388EEAFF, 0x028151FF, 0xA55043FF, 0x0DE018FF,
  1889. 0x93AB1CFF, 0x95BAF0FF, 0x369976FF, 0x18F71FFF, 0x4B8987FF,
  1890. 0x491B9EFF, 0x829DC7FF, 0xBCE635FF, 0xCEA6DFFF, 0x20D4ADFF,
  1891. 0x2D74FDFF, 0x3C1C0DFF, 0x12D6D4FF, 0x48C000FF, 0x2A51E2FF,
  1892. 0xE3AC12FF, 0xFC42A8FF, 0x2FC827FF, 0x1A30BFFF, 0xB740C2FF,
  1893. 0x42ACF5FF, 0x2FD9DEFF, 0xFAFB71FF, 0x05D1CDFF, 0xC471BDFF,
  1894. 0x94436EFF, 0xC1F7ECFF, 0xCE79EEFF, 0xBD1EF2FF, 0x93B7E4FF,
  1895. 0x3214AAFF, 0x184D3BFF, 0xAE4B99FF, 0x7E49D7FF, 0x4C436EFF,
  1896. 0xFA24CCFF, 0xCE76BEFF, 0xA04E0AFF, 0x9F945CFF, 0xDCDE3DFF,
  1897. 0x10C9C5FF, 0x70524DFF, 0x0BE472FF, 0x8A2CD7FF, 0x6152C2FF,
  1898. 0xCF72A9FF, 0xE59338FF, 0xEEDC2DFF, 0xD8C762FF, 0xD8C762FF
  1899. },
  1900. #endif
  1901. /*
  1902. * FIXES_gscMaxPassengers[]
  1903. *
  1904. * This is a compressed (4-bit) list of the maximum number of passengers in
  1905. * any vehicle, confirmed by a number of sources. "F" (15) means invalid
  1906. * vehicle.
  1907. */
  1908. #if FIX_OnPlayerEnterVehicle
  1909. FIXES_gscMaxPassengers[] =
  1910. {
  1911. 0x10331113, 0x11311131, 0x11331313, 0x80133301, 0x1381F110, 0x10311103, 0x10001F10, 0x11113311, 0x13113311,
  1912. 0x31101100, 0x30001301, 0x11031311, 0x11111331, 0x10013111, 0x01131100, 0x11111110, 0x11100031, 0x11130221,
  1913. 0x33113311, 0x11111101, 0x33101133, 0x101001F0, 0x03133111, 0xFF11113F, 0x13330111, 0xFF131111, 0x0000FF3F
  1914. },
  1915. #endif
  1916. /*
  1917. * FIXES_gscVehicleMods[]
  1918. *
  1919. * This is a bit array of all the valid mods (-1000) for all vehicles (-400)
  1920. * EXCEPT for vehicle 576 (Tornado), which has just TWO extra mods on it,
  1921. * that should spill over in to an extra cell of data (requiring an extra
  1922. * 848 bytes of data total to make the array work). Instead this (hopefully
  1923. * rare) case is handled explicitly in "OnVehicleMod". It seems that most
  1924. * vehicles are:
  1925. *
  1926. * 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1927. *
  1928. * I don't know yet if this can be used to our advantage to improve the code
  1929. * somehow - it seems like that would require more explicit model handling.
  1930. */
  1931. #if FIX_OnVehicleMod
  1932. FIXES_gscVehicleMods[] =
  1933. {
  1934. 0x033C2700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1935. 0x021A27FA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  1936. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1937. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1938. 0x023B2785, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1939. 0x02BC4703, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1940. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1941. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1942. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1943. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1944. 0x03BA278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1945. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1946. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1947. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1948. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1949. 0x028E078A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1950. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1951. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1952. 0x02310744, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1953. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1954. 0x0228073A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1955. 0x02BD4701, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1956. 0x023A2780, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1957. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1958. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1959. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1960. 0x0228077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1961. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1962. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1963. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1964. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1965. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1966. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1967. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1968. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1969. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1970. 0x027A27CA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1971. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1972. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1973. 0x0282278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  1974. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1975. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1976. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1977. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1978. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1979. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1980. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1981. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1982. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1983. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1984. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1985. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1986. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1987. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1988. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1989. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1990. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1991. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1992. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1993. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1994. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1995. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1996. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1997. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1998. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1999. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2000. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2001. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2002. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2003. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2004. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2005. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2006. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2007. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2008. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2009. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2010. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2011. 0x023E07C0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2012. 0x03703730, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2013. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2014. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2015. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2016. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2017. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2018. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2019. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2020. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2021. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2022. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2023. 0x031D2775, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2024. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2025. 0x02BE4788, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2026. 0x02010771, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2027. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2028. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2029. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2030. 0x029A0FCE, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000,
  2031. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2032. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2033. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2034. 0x03382700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2035. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2036. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2037. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2038. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2039. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2040. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2041. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2042. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2043. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2044. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2045. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2046. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2047. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2048. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2049. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2050. 0x023F8795, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2051. 0x029F078C, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2052. 0x029627EA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2053. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2054. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2055. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2056. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2057. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2058. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2059. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2060. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2061. 0x0236C782, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2062. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2063. 0x029E1FCA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2064. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2065. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2066. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2067. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2068. 0x02000700, 0x00000000, 0x00FFFE00, 0xFC000437, 0x00000000, 0x021C0000,
  2069. 0x02000700, 0x00000000, 0x00FFFE00, 0x03FE6007, 0x00000000, 0x00000000,
  2070. 0x02000700, 0x00000000, 0x00FFFE00, 0x00001B87, 0x00000001, 0x01E00000,
  2071. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2072. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2073. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2074. 0x039E07D2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2075. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2076. 0x023CC700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000,
  2077. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2078. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2079. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2080. 0x038E07D6, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2081. 0x023D0709, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000,
  2082. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2083. 0x029E1F8A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2084. 0x029C077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2085. 0x02BD076C, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2086. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2087. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2088. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2089. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2090. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2091. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2092. 0x02000700, 0x00000000, 0xFFFFFE00, 0x00000007, 0x00000000, 0x000001F8,
  2093. 0x02000700, 0x00000000, 0x00FFFFFE, 0x00000007, 0xC0000000, 0x00002007,
  2094. 0xFE000700, 0x00000003, 0x00FFFE00, 0x00000007, 0x00003C00, 0x00000600,
  2095. 0xCE000700, 0xFF800000, 0x00FFFE01, 0x00000007, 0x3C000000, 0x00000000,
  2096. 0x02000700, 0x000003FC, 0x00FFFE00, 0x00000007, 0x003C0000, 0x00001800,
  2097. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2098. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2099. 0x02000700, 0x007FE000, 0x00FFFE00, 0x00000007, 0x03C00000, 0x00000000,
  2100. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2101. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000047, 0x0000003E, 0x3C000000,
  2102. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2103. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2104. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2105. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2106. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2107. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2108. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2109. 0x02000700, 0x00001C00, 0x00FFFE00, 0x0000000F, 0x00000000, 0x0003C000,
  2110. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x000003C0, 0xC0000000,
  2111. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2112. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2113. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2114. 0x029607C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2115. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2116. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2117. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2118. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2119. 0x03FFE7CD, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2120. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2121. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2122. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2123. 0x031727F1, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000,
  2124. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2125. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2126. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2127. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2128. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2129. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2130. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2131. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2132. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2133. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2134. 0x025627F0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2135. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2136. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2137. 0x039E07C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2138. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2139. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2140. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2141. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2142. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2143. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2144. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2145. 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000
  2146. },
  2147. #endif
  2148. /*
  2149. * FIXES_gscAnimIndexes[]
  2150. *
  2151. * Which index each letter starts at. Sometimes crashes the compiler...
  2152. */
  2153. #if FIX_ApplyAnimation || FIX_ApplyAnimation_2
  2154. FIXES_gscAnimIndexes[24] =
  2155. {
  2156. 0, 2, 21, 35, 42, 42, 53, 62, 64, 67, 68, 71, 75, 81, 82, 84, 94, 96, 104, 121, 126, 127, 130, 134
  2157. },
  2158. #endif
  2159. /*
  2160. * FIXES_gscAnimLib[]
  2161. *
  2162. * List of valid animation libraries.
  2163. */
  2164. #if FIX_ApplyAnimation || FIX_ApplyAnimation_2
  2165. FIXES_gscAnimLib[134][] =
  2166. {
  2167. "AIRPORT", "ATTRACTORS", "BAR", "BASEBALL", "BD_FIRE",
  2168. "BEACH", "BENCHPRESS", "BF_INJECTION", "BIKE_DBZ", "BIKED",
  2169. "BIKEH", "BIKELEAP", "BIKES", "BIKEV", "BLOWJOBZ",
  2170. "BMX", "BOMBER", "BOX", "BSKTBALL", "BUDDY",
  2171. "BUS", "CAMERA", "CAR", "CAR_CHAT", "CARRY",
  2172. "CASINO", "CHAINSAW", "CHOPPA", "CLOTHES", "COACH",
  2173. "COLT45", "COP_AMBIENT", "COP_DVBYZ", "CRACK", "CRIB",
  2174. "DAM_JUMP", "DANCING", "DEALER", "DILDO", "DODGE",
  2175. "DOZER", "DRIVEBYS", "FAT", "FIGHT_B", "FIGHT_C",
  2176. "FIGHT_D", "FIGHT_E", "FINALE", "FINALE2", "FLAME",
  2177. "FLOWERS", "FOOD", "FREEWEIGHTS", "GANGS", "GFUNK",
  2178. "GHANDS", "GHETTO_DB", "GOGGLES", "GRAFFITI", "GRAVEYARD",
  2179. "GRENADE", "GYMNASIUM", "HAIRCUTS", "HEIST9", "INT_HOUSE",
  2180. "INT_OFFICE", "INT_SHOP", "JST_BUISNESS", "KART", "KISSING",
  2181. "KNIFE", "LAPDAN1", "LAPDAN2", "LAPDAN3", "LOWRIDER",
  2182. "MD_CHASE", "MD_END", "MEDIC", "MISC", "MTB",
  2183. "MUSCULAR", "NEVADA", "ON_LOOKERS", "OTB", "PARACHUTE",
  2184. "PARK", "PAULNMAC", "PED", "PLAYER_DVBYS", "PLAYIDLES",
  2185. "POLICE", "POOL", "POOR", "PYTHON", "QUAD",
  2186. "QUAD_DBZ", "RAPPING", "RIFLE", "RIOT", "ROB_BANK",
  2187. "ROCKET", "RUNNINGMAN", "RUSTLER", "RYDER", "SCRATCHING",
  2188. "SEX", "SHAMAL", "SHOP", "SHOTGUN", "SILENCED",
  2189. "SKATE", "SMOKING", "SNIPER", "SNM", "SPRAYCAN",
  2190. "STRIP", "SUNBATHE", "SWAT", "SWEET", "SWIM",
  2191. "SWORD", "TANK", "TATTOOS", "TEC", "TRAIN",
  2192. "TRUCK", "UZI", "VAN", "VENDING", "VORTEX",
  2193. "WAYFARER", "WEAPONS", "WOP", "WUZI"
  2194. },
  2195. #endif
  2196. /*
  2197. * FIXES_gscDot[]
  2198. *
  2199. * ".".
  2200. */
  2201. FIXES_gscDot[] = ".",
  2202. /*
  2203. * FIXES_gscSpec@[]
  2204. *
  2205. * Specifier "".
  2206. */
  2207. FIXES_gscSpec@[] = "",
  2208. /*
  2209. * FIXES_gscSpec@i[]
  2210. *
  2211. * Specifier "i".
  2212. */
  2213. FIXES_gscSpec@i[] = "i",
  2214. /*
  2215. * FIXES_gscSpec@ii[]
  2216. *
  2217. * Specifier "ii".
  2218. */
  2219. FIXES_gscSpec@ii[] = "ii",
  2220. /*
  2221. * FIXES_gscSpec@ai[]
  2222. *
  2223. * Specifier "ai".
  2224. */
  2225. FIXES_gscSpec@ai[] = "ai",
  2226. /*
  2227. * FIXES_gscSpec@is[]
  2228. *
  2229. * Specifier "is".
  2230. */
  2231. FIXES_gscSpec@is[] = "is",
  2232. /*
  2233. * FIXES_gscSpec@iii[]
  2234. *
  2235. * Specifier "iii".
  2236. */
  2237. FIXES_gscSpec@iii[] = "iii",
  2238. /*
  2239. * FIXES_gscSpec@isii[]
  2240. *
  2241. * Specifier "isii".
  2242. */
  2243. FIXES_gscSpec@isii[] = "isii",
  2244. /*
  2245. * FIXES_gscSpec@ifff[]
  2246. *
  2247. * Specifier "ifff".
  2248. */
  2249. FIXES_gscSpec@ifff[] = "ifff",
  2250. /*
  2251. * FIXES_gscSpec@iifff[]
  2252. *
  2253. * Specifier "iifff".
  2254. */
  2255. FIXES_gscSpec@iifff[] = "iifff",
  2256. /*
  2257. * FIXES_gscSpec@iffff[]
  2258. *
  2259. * Specifier "iffff".
  2260. */
  2261. FIXES_gscSpec@iffff[] = "iffff",
  2262. /*
  2263. * FIXES_gscSpec@iiiis[]
  2264. *
  2265. * Specifier "iiiis".
  2266. */
  2267. FIXES_gscSpec@iiiis[] = "iiiis",
  2268. /*
  2269. * FIXES_gscSpec@iiiii[]
  2270. *
  2271. * Specifier "iiiii".
  2272. */
  2273. FIXES_gscSpec@iiiii[] = "iiiii",
  2274. /*
  2275. * FIXES_gscSpec@iiiiii[]
  2276. *
  2277. * Specifier "iiiiii".
  2278. */
  2279. FIXES_gscSpec@iiiiii[] = "iiiiii",
  2280. /*
  2281. * FIXES_gscTempName[]
  2282. *
  2283. * The temporary name to give when renaming people.
  2284. */
  2285. FIXES_gscTempName[] = "FIXES_TEMP_NAME",
  2286. /*
  2287. * FIXES_gscOrderProperty[]
  2288. *
  2289. * The property to check for script ordering.
  2290. */
  2291. FIXES_gscOrderProperty[] = "FIXES_gscOrderProperty",
  2292. /*
  2293. * FIXES_gscNoGMProperty[]
  2294. *
  2295. * Call "_FIXES_DetermineOrder" in the GM or not?
  2296. */
  2297. FIXES_gscNoGMProperty[] = "FIXES_gscNoGMProperty",
  2298. /*
  2299. * FIXES_gscDetermineOrder[]
  2300. *
  2301. * Name of the ordering callback.
  2302. */
  2303. FIXES_gscDetermineOrder[] = "_FIXES_DetermineOrder",
  2304. /*
  2305. * FIXES_gscSetPlayerMenu[]
  2306. *
  2307. * Name of the remote set player menu function.
  2308. */
  2309. FIXES_gscSetPlayerMenu[] = "_FIXES_SetPlayerMenu",
  2310. /*
  2311. * FIXES_gscClearPlayerMenu[]
  2312. *
  2313. * Name of the remote function to clear a player's menu set.
  2314. */
  2315. FIXES_gscClearPlayerMenu[] = "_FIXES_ClearPlayerMenu",
  2316. /*
  2317. * FIXES_gscAllowTeleport[]
  2318. *
  2319. * Name of the remote allow teleport function.
  2320. */
  2321. FIXES_gscAllowTeleport[] = "_FIXES_AllowTeleport",
  2322. /*
  2323. * FIXES_gscPutPlayerInVehicle[]
  2324. *
  2325. * Name of the remote vehicle entry function.
  2326. */
  2327. FIXES_gscPutPlayerInVehicle[] = "_FIXES_PutPlayerInVehicle",
  2328. /*
  2329. * FIXES_gscAllowInteriorWeapons[]
  2330. *
  2331. * Name of the remote interior weapons function.
  2332. */
  2333. FIXES_gscAllowInteriorWeapons[] = "_FIXES_AllowInteriorWeapons",
  2334. /*
  2335. * FIXES_gscSetPlayerAttachedObj[]
  2336. *
  2337. * Name of the remote attache object function.
  2338. */
  2339. FIXES_gscSetPlayerAttachedObj[] = "_FIXES_SetPlayerAttachedObject",
  2340. /*
  2341. * FIXES_gscTogglePlayerControl[]
  2342. *
  2343. * Name of the remote player toggle function.
  2344. */
  2345. FIXES_gscTogglePlayerControl[] = "_FIXES_TogglePlayerControllable",
  2346. /*
  2347. * FIXES_gscSetPlayerWorldBounds[]
  2348. *
  2349. * Name of the remote world bounds function.
  2350. */
  2351. FIXES_gscSetPlayerWorldBounds[] = "_FIXES_SetPlayerWorldBounds",
  2352. /*
  2353. * FIXES_gscGameTextShow[]
  2354. *
  2355. * Name of the remote GameText show function.
  2356. */
  2357. FIXES_gscGameTextShow[] = "_FIXES_GameTextShow",
  2358. /*
  2359. * FIXES_gscReturnProperty[]
  2360. *
  2361. * The property for accurate returns.
  2362. */
  2363. FIXES_gscReturnProperty[] = "FIXES_gscReturnProperty",
  2364. /*
  2365. * FIXES_gscSingleProperty[]
  2366. *
  2367. * The property for checking this is the only running script with fixes in.
  2368. */
  2369. FIXES_gscSingleProperty[] = "FIXES_gscSingleProperty",
  2370. /*
  2371. * FIXES_gscMenuProperty[]
  2372. *
  2373. * The property for a player's current menu.
  2374. */
  2375. FIXES_gscMenuProperty[] = "FIXES_gscMenuProperty",
  2376. /*
  2377. * FIXES_gscFixesError[]
  2378. *
  2379. * Error shown when multiple scripts are detected.
  2380. */
  2381. FIXES_gscFixesError[] = "\7\7\7\7\7" "\n" \
  2382. "*** fixes.inc error: Running multiple scripts compiled with \"fixes.inc\"..." "\n" \
  2383. "*** Please compile your modes with \"#define FIXES_Single 0\" at the top, as" "\n" \
  2384. "*** this setting is no longer the default (to improve the more common case)." ;
  2385. /*
  2386. * _FIXES_KEY_AIM
  2387. * KEY_AIM
  2388. *
  2389. * Because the default SA:MP includes missed this one.
  2390. */
  2391. #define _FIXES_KEY_AIM (128)
  2392. #if FIX_KEY_AIM
  2393. #define KEY_AIM _FIXES_KEY_AIM
  2394. #endif
  2395. /*
  2396. * _FIXES_SPECIAL_ACTION_PISSING
  2397. * SPECIAL_ACTION_PISSING
  2398. *
  2399. * Because the default SA:MP includes missed this one.
  2400. */
  2401. #define _FIXES_SPECIAL_ACTION_PISSING (68)
  2402. #if FIX_SPECIAL_ACTION_PISSING
  2403. #define SPECIAL_ACTION_PISSING _FIXES_SPECIAL_ACTION_PISSING
  2404. #endif
  2405. /*
  2406. * IsValidVehicle
  2407. *
  2408. * Because the default SA:MP includes missed this one.
  2409. */
  2410. #if FIX_IsValidVehicle
  2411. native IsValidVehicle(vehicleid);
  2412. #endif
  2413. /*
  2414. * GetGravity
  2415. *
  2416. * Because the default SA:MP includes missed this one.
  2417. */
  2418. #if FIX_GetGravity
  2419. native Float:GetGravity();
  2420. #endif
  2421. /*
  2422. * gpci
  2423. *
  2424. * Because the default SA:MP includes missed this one.
  2425. */
  2426. #if FIX_gpci
  2427. native gpci(playerid, serial[], maxlen);
  2428. #endif
  2429. /*
  2430. * BODYPARTS
  2431. *
  2432. * Because the default SA:MP includes missed these.
  2433. */
  2434. #if FIX_BODYPARTS
  2435. #define BODY_PART_TORSO (3)
  2436. #define BODY_PART_GROIN (4)
  2437. #define BODY_PART_LEFT_ARM (5)
  2438. #define BODY_PART_RIGHT_ARM (6)
  2439. #define BODY_PART_LEFT_LEG (7)
  2440. #define BODY_PART_RIGHT_LEG (8)
  2441. #define BODY_PART_HEAD (9)
  2442. #endif
  2443. /*
  2444. * CAMERAMODES
  2445. *
  2446. * Because the default SA:MP includes missed these.
  2447. */
  2448. #if FIX_CAMERAMODES
  2449. #define CAM_MODE_DISCONNECTED (-1)
  2450. #define CAM_MODE_NONE (0)
  2451. #define CAM_MODE_BEHINDCAR (3)
  2452. #define CAM_MODE_FOLLOWPED (4)
  2453. #define CAM_MODE_SNIPER (7)
  2454. #define CAM_MODE_ROCKETLAUNCHER (8)
  2455. #define CAM_MODE_FIXED (15)
  2456. #define CAM_MODE_1STPERSON (16)
  2457. #define CAM_MODE_CAM_ON_A_STRING (18)
  2458. #define CAM_MODE_BEHINDBOAT (22)
  2459. #define CAM_MODE_CAMERA (46)
  2460. #define CAM_MODE_ROCKETLAUNCHER_HS (51)
  2461. #define CAM_MODE_AIMWEAPON (53)
  2462. #define CAM_MODE_AIMWEAPON_FROMCAR (55)
  2463. #define CAM_MODE_DW_HELI_CHASE (56)
  2464. #endif
  2465. /*
  2466. * IS_FILTERSCRIPT
  2467. *
  2468. * "FILTERSCRIPT" can't always be relied on to be set. This is not a pre-
  2469. * processor macro, but may be better than nothing (also used internally).
  2470. */
  2471. #if FIX_FILTERSCRIPT
  2472. #define IS_FILTERSCRIPT _FIXES_gIsFilterscript
  2473. #endif
  2474. /*
  2475. * FIXES_DetermineOrder()
  2476. *
  2477. * Figure out which script is called first by callbacks.
  2478. */
  2479. #if !FIXES_Single
  2480. forward _FIXES_DetermineOrder();
  2481. static FIXES_DetermineOrder()
  2482. {
  2483. deleteproperty(5, FIXES_gscOrderProperty),
  2484. // Called in the Game Mode first (thus needs correcting).
  2485. setproperty(5, FIXES_gscNoGMProperty, 1),
  2486. CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@),
  2487. deleteproperty(5, FIXES_gscNoGMProperty),
  2488. CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@);
  2489. }
  2490. #endif
  2491. /*
  2492. * FIXES_IsPlayerConnected(playerid)
  2493. *
  2494. * FIXES:
  2495. * IsPlayerConnected
  2496. */
  2497. #if defined _ALS_IsPlayerConnected
  2498. #error _ALS_IsPlayerConnected defined
  2499. #endif
  2500. native BAD_IsPlayerConnected(playerid) = IsPlayerConnected;
  2501. #if FIX_IsPlayerConnected
  2502. stock FIXES_IsPlayerConnected(playerid)
  2503. {
  2504. return _FIXES_IS_PLAYER_CONNECTED(playerid);
  2505. }
  2506. #define _ALS_IsPlayerConnected
  2507. #define IsPlayerConnected FIXES_IsPlayerConnected
  2508. #endif
  2509. /*
  2510. * _FIXES_CreateGameTextDraws(playerid, test)
  2511. *
  2512. * Create the text draws used to replicate game texts.
  2513. *
  2514. * FIXES:
  2515. * GameText
  2516. */
  2517. #if FIX_GameText
  2518. static _FIXES_CreateGameTextDraws(const playerid)
  2519. {
  2520. if (playerid == INVALID_PLAYER_ID)
  2521. {
  2522. new
  2523. Text:t;
  2524. #if FIX_GameTextStyles
  2525. // Global style 7 (vehicle name).
  2526. t = FIXES_gsGTStyle[7] = TextDrawCreate(608.000000, 344.000000, FIXES_gscSpace),
  2527. TextDrawLetterSize(t, 1.000000, 3.000000),
  2528. TextDrawAlignment(t, 3),
  2529. TextDrawColor(t, 0x36682CFF),
  2530. TextDrawSetShadow(t, 0),
  2531. TextDrawSetOutline(t, 2),
  2532. TextDrawBackgroundColor(t, 0x000000AA),
  2533. TextDrawFont(t, 2),
  2534. TextDrawSetProportional(t, 1),
  2535. TextDrawUseBox(t, true),
  2536. TextDrawBoxColor(t, 0x00000000),
  2537. TextDrawTextSize(t, 10.0, 200.0);
  2538. // Global style 8 (location name).
  2539. t = FIXES_gsGTStyle[8] = TextDrawCreate(608.000000, 386.500000, FIXES_gscSpace),
  2540. TextDrawLetterSize(t, 1.200000, 3.799998),
  2541. TextDrawAlignment(t, 3),
  2542. TextDrawColor(t, 0xACCBF1FF),
  2543. TextDrawSetShadow(t, 0),
  2544. TextDrawSetOutline(t, 2),
  2545. TextDrawBackgroundColor(t, 0x000000AA),
  2546. TextDrawFont(t, 0),
  2547. TextDrawSetProportional(t, 1),
  2548. TextDrawUseBox(t, true),
  2549. TextDrawBoxColor(t, 0x00000000),
  2550. TextDrawTextSize(t, 10.0, 200.0);
  2551. // Global style 9 (radio name).
  2552. t = FIXES_gsGTStyle[9] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace),
  2553. TextDrawLetterSize(t, 0.600000, 1.899999),
  2554. TextDrawAlignment(t, 2),
  2555. TextDrawColor(t, 0x906210FF),
  2556. TextDrawSetShadow(t, 0),
  2557. TextDrawSetOutline(t, 1),
  2558. TextDrawBackgroundColor(t, 0x000000AA),
  2559. TextDrawFont(t, 2),
  2560. TextDrawSetProportional(t, 1),
  2561. TextDrawUseBox(t, true),
  2562. TextDrawBoxColor(t, 0x00000000),
  2563. TextDrawTextSize(t, 200.0, 620.0);
  2564. // Global style 10 (radio switch).
  2565. t = FIXES_gsGTStyle[10] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace),
  2566. TextDrawLetterSize(t, 0.600000, 1.899999),
  2567. TextDrawAlignment(t, 2),
  2568. TextDrawColor(t, 0x969696FF),
  2569. TextDrawSetShadow(t, 0),
  2570. TextDrawSetOutline(t, 1),
  2571. TextDrawBackgroundColor(t, 0x000000AA),
  2572. TextDrawFont(t, 2),
  2573. TextDrawSetProportional(t, 1),
  2574. TextDrawUseBox(t, true),
  2575. TextDrawBoxColor(t, 0x00000000),
  2576. TextDrawTextSize(t, 200.0, 620.0);
  2577. // Global style 11 (positive money).
  2578. t = FIXES_gsGTStyle[11] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace),
  2579. TextDrawLetterSize(t, 0.550000, 2.150000),
  2580. TextDrawAlignment(t, 3),
  2581. TextDrawColor(t, 0x36682CFF),
  2582. TextDrawSetShadow(t, 0),
  2583. TextDrawSetOutline(t, 2),
  2584. TextDrawBackgroundColor(t, 0x000000FF),
  2585. TextDrawFont(t, 3),
  2586. TextDrawSetProportional(t, 1),
  2587. TextDrawUseBox(t, true),
  2588. TextDrawBoxColor(t, 0x00000000),
  2589. TextDrawTextSize(t, 10.0, 200.0);
  2590. // Global style 12 (negative money).
  2591. t = FIXES_gsGTStyle[12] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace),
  2592. TextDrawLetterSize(t, 0.550000, 2.150000),
  2593. TextDrawAlignment(t, 3),
  2594. TextDrawColor(t, 0xB4191DFF),
  2595. TextDrawSetShadow(t, 0),
  2596. TextDrawSetOutline(t, 2),
  2597. TextDrawBackgroundColor(t, 0x000000FF),
  2598. TextDrawFont(t, 3),
  2599. TextDrawSetProportional(t, 1),
  2600. TextDrawUseBox(t, true),
  2601. TextDrawBoxColor(t, 0x00000000),
  2602. TextDrawTextSize(t, 10.0, 200.0);
  2603. // Global style 13 (stunt).
  2604. t = FIXES_gsGTStyle[13] = TextDrawCreate(380.000000, 341.000000, FIXES_gscSpace),
  2605. TextDrawLetterSize(t, 0.579999, 2.400000),
  2606. TextDrawTextSize(t, 40.000000, 460.000000),
  2607. TextDrawAlignment(t, 2),
  2608. TextDrawColor(t, 0xD7D3CCFF),
  2609. TextDrawUseBox(t, true),
  2610. TextDrawBoxColor(t, 0),
  2611. TextDrawSetShadow(t, 2),
  2612. TextDrawSetOutline(t, 0),
  2613. TextDrawBackgroundColor(t, 0x000000AA),
  2614. TextDrawFont(t, 1),
  2615. TextDrawSetProportional(t, 1),
  2616. #endif
  2617. // Global style 0.
  2618. t = FIXES_gsGTStyle[0] = TextDrawCreate(320.0, 214.0, FIXES_gscSpace),
  2619. TextDrawLetterSize(t, 1.3, 3.6),
  2620. TextDrawAlignment(t, 2),
  2621. TextDrawColor(t, 0x906210FF),
  2622. TextDrawSetShadow(t, 0),
  2623. TextDrawSetOutline(t, 2),
  2624. TextDrawBackgroundColor(t, 0x000000AA),
  2625. TextDrawFont(t, 3),
  2626. TextDrawSetProportional(t, 1),
  2627. TextDrawUseBox(t, true),
  2628. TextDrawBoxColor(t, 0x00000000),
  2629. TextDrawTextSize(t, 200.0, 620.0);
  2630. // Global style 1.
  2631. t = FIXES_gsGTStyle[1] = TextDrawCreate(620.0, 310.0, FIXES_gscSpace),
  2632. TextDrawLetterSize(t, 1.0, 2.6),
  2633. TextDrawAlignment(t, 3),
  2634. TextDrawColor(t, 0x906210FF),
  2635. TextDrawSetShadow(t, 0),
  2636. TextDrawSetOutline(t, 2),
  2637. TextDrawBackgroundColor(t, 0x000000AA),
  2638. TextDrawFont(t, 3),
  2639. TextDrawSetProportional(t, 1),
  2640. TextDrawUseBox(t, true),
  2641. TextDrawBoxColor(t, 0x00000000),
  2642. TextDrawTextSize(t, 10.0, 200.0);
  2643. // Global style 2.
  2644. t = FIXES_gsGTStyle[2] = TextDrawCreate(320.0, 156.0, FIXES_gscSpace),
  2645. TextDrawLetterSize(t, 2.1, 4.2),
  2646. TextDrawAlignment(t, 2),
  2647. TextDrawColor(t, 0xE1E1E1FF),
  2648. TextDrawSetShadow(t, 0),
  2649. TextDrawSetOutline(t, 3),
  2650. TextDrawBackgroundColor(t, 0x000000AA),
  2651. TextDrawFont(t, 0),
  2652. TextDrawSetProportional(t, 1),
  2653. TextDrawUseBox(t, true),
  2654. TextDrawBoxColor(t, 0x00000000),
  2655. TextDrawTextSize(t, 200.0, 620.0);
  2656. // Global style 3.
  2657. t = FIXES_gsGTStyle[3] = TextDrawCreate(320.000000, 154.500000, FIXES_gscSpace),
  2658. TextDrawLetterSize(t, 0.600000, 2.750000),
  2659. TextDrawAlignment(t, 2),
  2660. TextDrawColor(t, 0x906210FF),
  2661. TextDrawSetShadow(t, 0),
  2662. TextDrawSetOutline(t, 2),
  2663. TextDrawBackgroundColor(t, 0x000000AA),
  2664. TextDrawFont(t, 2),
  2665. TextDrawSetProportional(t, 1),
  2666. TextDrawUseBox(t, true),
  2667. TextDrawBoxColor(t, 0x00000000),
  2668. TextDrawTextSize(t, 200.0, 620.0);
  2669. // Global style 4.
  2670. t = FIXES_gsGTStyle[4] = TextDrawCreate(320.000000, 115.500000, FIXES_gscSpace),
  2671. TextDrawLetterSize(t, 0.600000, 2.750000),
  2672. TextDrawAlignment(t, 2),
  2673. TextDrawColor(t, 0x906210FF),
  2674. TextDrawSetShadow(t, 0),
  2675. TextDrawSetOutline(t, 2),
  2676. TextDrawBackgroundColor(t, 0x000000AA),
  2677. TextDrawFont(t, 2),
  2678. TextDrawSetProportional(t, 1),
  2679. TextDrawUseBox(t, true),
  2680. TextDrawBoxColor(t, 0x00000000),
  2681. TextDrawTextSize(t, 200.0, 620.0);
  2682. // Global style 5.
  2683. t = FIXES_gsGTStyle[5] = TextDrawCreate(320.0, 217.0, FIXES_gscSpace),
  2684. TextDrawLetterSize(t, 0.6, 2.75),
  2685. TextDrawAlignment(t, 2),
  2686. TextDrawColor(t, 0xE1E1E1FF),
  2687. TextDrawSetShadow(t, 0),
  2688. TextDrawSetOutline(t, 2),
  2689. TextDrawBackgroundColor(t, 0x000000AA),
  2690. TextDrawFont(t, 2),
  2691. TextDrawSetProportional(t, 1),
  2692. TextDrawUseBox(t, true),
  2693. TextDrawBoxColor(t, 0x00000000),
  2694. TextDrawTextSize(t, 200.0, 620.0);
  2695. // Global style 6.
  2696. t = FIXES_gsGTStyle[6] = TextDrawCreate(320.000000, 60.000000, FIXES_gscSpace),
  2697. TextDrawLetterSize(t, 1.000000, 3.599998),
  2698. TextDrawAlignment(t, 2),
  2699. TextDrawColor(t, 0xACCBF1FF),
  2700. TextDrawSetShadow(t, 0),
  2701. TextDrawSetOutline(t, 2),
  2702. TextDrawBackgroundColor(t, 0x000000AA),
  2703. TextDrawFont(t, 3),
  2704. TextDrawSetProportional(t, 1),
  2705. TextDrawUseBox(t, true),
  2706. TextDrawBoxColor(t, 0x00000000),
  2707. TextDrawTextSize(t, 200.0, 620.0);
  2708. }
  2709. else
  2710. {
  2711. new
  2712. PlayerText:t;
  2713. #if FIX_GameTextStyles
  2714. // Global style 7 (playerid, vehicle name).
  2715. t = FIXES_gsPGTStyle[playerid][7] = CreatePlayerTextDraw(playerid, 608.000000, 344.000000, FIXES_gscSpace),
  2716. PlayerTextDrawLetterSize(playerid, t, 1.000000, 3.000000),
  2717. PlayerTextDrawAlignment(playerid, t, 3),
  2718. PlayerTextDrawColor(playerid, t, 0x36682CFF),
  2719. PlayerTextDrawSetShadow(playerid, t, 0),
  2720. PlayerTextDrawSetOutline(playerid, t, 2),
  2721. PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2722. PlayerTextDrawFont(playerid, t, 2),
  2723. PlayerTextDrawSetProportional(playerid, t, 1),
  2724. PlayerTextDrawUseBox(playerid, t, true),
  2725. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2726. PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
  2727. // Global style 8 (playerid, location name).
  2728. t = FIXES_gsPGTStyle[playerid][8] = CreatePlayerTextDraw(playerid, 608.000000, 386.500000, FIXES_gscSpace),
  2729. PlayerTextDrawLetterSize(playerid, t, 1.200000, 3.799998),
  2730. PlayerTextDrawAlignment(playerid, t, 3),
  2731. PlayerTextDrawColor(playerid, t, 0xACCBF1FF),
  2732. PlayerTextDrawSetShadow(playerid, t, 0),
  2733. PlayerTextDrawSetOutline(playerid, t, 2),
  2734. PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2735. PlayerTextDrawFont(playerid, t, 0),
  2736. PlayerTextDrawSetProportional(playerid, t, 1),
  2737. PlayerTextDrawUseBox(playerid, t, true),
  2738. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2739. PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
  2740. // Global style 9 (playerid, radio name).
  2741. t = FIXES_gsPGTStyle[playerid][9] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace),
  2742. PlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999),
  2743. PlayerTextDrawAlignment(playerid, t, 2),
  2744. PlayerTextDrawColor(playerid, t, 0x906210FF),
  2745. PlayerTextDrawSetShadow(playerid, t, 0),
  2746. PlayerTextDrawSetOutline(playerid, t, 1),
  2747. PlayerTextDrawBackgroundColor(playerid, t, 170),
  2748. PlayerTextDrawFont(playerid, t, 2),
  2749. PlayerTextDrawSetProportional(playerid, t, 1),
  2750. PlayerTextDrawUseBox(playerid, t, true),
  2751. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2752. PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2753. // Global style 10 (playerid, radio switch).
  2754. t = FIXES_gsPGTStyle[playerid][10] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace),
  2755. PlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999),
  2756. PlayerTextDrawAlignment(playerid, t, 2),
  2757. PlayerTextDrawColor(playerid, t, 0x969696FF),
  2758. PlayerTextDrawSetShadow(playerid, t, 0),
  2759. PlayerTextDrawSetOutline(playerid, t, 1),
  2760. PlayerTextDrawBackgroundColor(playerid, t, 170),
  2761. PlayerTextDrawFont(playerid, t, 2),
  2762. PlayerTextDrawSetProportional(playerid, t, 1),
  2763. PlayerTextDrawUseBox(playerid, t, true),
  2764. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2765. PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2766. // Global style 11 (playerid, positive money).
  2767. t = FIXES_gsPGTStyle[playerid][11] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace),
  2768. PlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000),
  2769. PlayerTextDrawAlignment(playerid, t, 3),
  2770. PlayerTextDrawColor(playerid, t, 0x36682CFF),
  2771. PlayerTextDrawSetShadow(playerid, t, 0),
  2772. PlayerTextDrawSetOutline(playerid, t, 2),
  2773. PlayerTextDrawBackgroundColor(playerid, t, 0x000000FF),
  2774. PlayerTextDrawFont(playerid, t, 3),
  2775. PlayerTextDrawSetProportional(playerid, t, 1),
  2776. PlayerTextDrawUseBox(playerid, t, true),
  2777. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2778. PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
  2779. // Global style 12 (playerid, negative money).
  2780. t = FIXES_gsPGTStyle[playerid][12] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace),
  2781. PlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000),
  2782. PlayerTextDrawAlignment(playerid, t, 3),
  2783. PlayerTextDrawColor(playerid, t, 0xB4191DFF),
  2784. PlayerTextDrawSetShadow(playerid, t, 0),
  2785. PlayerTextDrawSetOutline(playerid, t, 2),
  2786. PlayerTextDrawBackgroundColor(playerid, t, 0x000000FF),
  2787. PlayerTextDrawFont(playerid, t, 3),
  2788. PlayerTextDrawSetProportional(playerid, t, 1),
  2789. PlayerTextDrawUseBox(playerid, t, true),
  2790. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2791. PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
  2792. // Global style 13 (playerid, stunt).
  2793. t = FIXES_gsPGTStyle[playerid][13] = CreatePlayerTextDraw(playerid, 380.000000, 341.000000, FIXES_gscSpace),
  2794. PlayerTextDrawLetterSize(playerid, t, 0.579999, 2.400000),
  2795. PlayerTextDrawTextSize(playerid, t, 40.000000, 460.000000),
  2796. PlayerTextDrawAlignment(playerid, t, 2),
  2797. PlayerTextDrawColor(playerid, t, 0xD7D3CCFF),
  2798. PlayerTextDrawUseBox(playerid, t, true),
  2799. PlayerTextDrawBoxColor(playerid, t, 0),
  2800. PlayerTextDrawSetShadow(playerid, t, 2),
  2801. PlayerTextDrawSetOutline(playerid, t, 0),
  2802. PlayerTextDrawBackgroundColor(playerid, t, 170),
  2803. PlayerTextDrawFont(playerid, t, 1),
  2804. PlayerTextDrawSetProportional(playerid, t, 1);
  2805. #endif
  2806. // Global style 0.
  2807. t = FIXES_gsPGTStyle[playerid][0] = CreatePlayerTextDraw(playerid, 320.0, 214.0, FIXES_gscSpace),
  2808. PlayerTextDrawLetterSize(playerid, t, 1.3, 3.6),
  2809. PlayerTextDrawAlignment(playerid, t, 2),
  2810. PlayerTextDrawColor(playerid, t, 0x906210FF),
  2811. PlayerTextDrawSetShadow(playerid, t, 0),
  2812. PlayerTextDrawSetOutline(playerid, t, 2),
  2813. PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2814. PlayerTextDrawFont(playerid, t, 3),
  2815. PlayerTextDrawSetProportional(playerid, t, 1),
  2816. PlayerTextDrawUseBox(playerid, t, true),
  2817. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2818. PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2819. // Global style 1.
  2820. t = FIXES_gsPGTStyle[playerid][1] = CreatePlayerTextDraw(playerid, 620.0, 310.0, FIXES_gscSpace),
  2821. PlayerTextDrawLetterSize(playerid, t, 1.0, 2.6),
  2822. PlayerTextDrawAlignment(playerid, t, 3),
  2823. PlayerTextDrawColor(playerid, t, 0x906210FF),
  2824. PlayerTextDrawSetShadow(playerid, t, 0),
  2825. PlayerTextDrawSetOutline(playerid, t, 2),
  2826. PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2827. PlayerTextDrawFont(playerid, t, 3),
  2828. PlayerTextDrawSetProportional(playerid, t, 1),
  2829. PlayerTextDrawUseBox(playerid, t, true),
  2830. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2831. PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
  2832. // Global style 2.
  2833. t = FIXES_gsPGTStyle[playerid][2] = CreatePlayerTextDraw(playerid, 320.0, 156.0, FIXES_gscSpace),
  2834. PlayerTextDrawLetterSize(playerid, t, 2.1, 4.2),
  2835. PlayerTextDrawAlignment(playerid, t, 2),
  2836. PlayerTextDrawColor(playerid, t, 0xE1E1E1FF),
  2837. PlayerTextDrawSetShadow(playerid, t, 0),
  2838. PlayerTextDrawSetOutline(playerid, t, 3),
  2839. PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2840. PlayerTextDrawFont(playerid, t, 0),
  2841. PlayerTextDrawSetProportional(playerid, t, 1),
  2842. PlayerTextDrawUseBox(playerid, t, true),
  2843. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2844. PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2845. // Global style 3.
  2846. t = FIXES_gsPGTStyle[playerid][3] = CreatePlayerTextDraw(playerid, 320.000000, 154.500000, FIXES_gscSpace),
  2847. PlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000),
  2848. PlayerTextDrawAlignment(playerid, t, 2),
  2849. PlayerTextDrawColor(playerid, t, 0x906210FF),
  2850. PlayerTextDrawSetShadow(playerid, t, 0),
  2851. PlayerTextDrawSetOutline(playerid, t, 2),
  2852. PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2853. PlayerTextDrawFont(playerid, t, 2),
  2854. PlayerTextDrawSetProportional(playerid, t, 1),
  2855. PlayerTextDrawUseBox(playerid, t, true),
  2856. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2857. PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2858. // Global style 4.
  2859. t = FIXES_gsPGTStyle[playerid][4] = CreatePlayerTextDraw(playerid, 320.000000, 115.500000, FIXES_gscSpace),
  2860. PlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000),
  2861. PlayerTextDrawAlignment(playerid, t, 2),
  2862. PlayerTextDrawColor(playerid, t, 0x906210FF),
  2863. PlayerTextDrawSetShadow(playerid, t, 0),
  2864. PlayerTextDrawSetOutline(playerid, t, 2),
  2865. PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2866. PlayerTextDrawFont(playerid, t, 2),
  2867. PlayerTextDrawSetProportional(playerid, t, 1),
  2868. PlayerTextDrawUseBox(playerid, t, true),
  2869. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2870. PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2871. // Global style 5.
  2872. t = FIXES_gsPGTStyle[playerid][5] = CreatePlayerTextDraw(playerid, 320.0, 217.0, FIXES_gscSpace),
  2873. PlayerTextDrawLetterSize(playerid, t, 0.6, 2.75),
  2874. PlayerTextDrawAlignment(playerid, t, 2),
  2875. PlayerTextDrawColor(playerid, t, 0xE1E1E1FF),
  2876. PlayerTextDrawSetShadow(playerid, t, 0),
  2877. PlayerTextDrawSetOutline(playerid, t, 2),
  2878. PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2879. PlayerTextDrawFont(playerid, t, 2),
  2880. PlayerTextDrawSetProportional(playerid, t, 1),
  2881. PlayerTextDrawUseBox(playerid, t, true),
  2882. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2883. PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2884. // Global style 6.
  2885. t = FIXES_gsPGTStyle[playerid][6] = CreatePlayerTextDraw(playerid, 320.000000, 60.000000, FIXES_gscSpace),
  2886. PlayerTextDrawLetterSize(playerid, t, 1.000000, 3.599998),
  2887. PlayerTextDrawAlignment(playerid, t, 2),
  2888. PlayerTextDrawColor(playerid, t, 0xACCBF1FF),
  2889. PlayerTextDrawSetShadow(playerid, t, 0),
  2890. PlayerTextDrawSetOutline(playerid, t, 2),
  2891. PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2892. PlayerTextDrawFont(playerid, t, 3),
  2893. PlayerTextDrawSetProportional(playerid, t, 1),
  2894. PlayerTextDrawUseBox(playerid, t, true),
  2895. PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2896. PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2897. }
  2898. }
  2899. #endif
  2900. /*
  2901. * OnFilterScriptInit()
  2902. *
  2903. * Set "IS_FILTERSCRIPT" to true as this callback is ONLY called if this script
  2904. * is actually a FilterScript. Then call "FIXES_OnScriptInit".
  2905. *
  2906. * FIXES:
  2907. * IS_FILTERSCRIPT
  2908. * OnPlayerConnect
  2909. * GameText
  2910. */
  2911. public OnFilterScriptInit()
  2912. {
  2913. // It is possible for this to be the only thing done in this function!
  2914. _FIXES_gIsFilterscript = true;
  2915. state _ALS : _ALS_go;
  2916. #if FIXES_Single
  2917. // Check this really IS the only script running.
  2918. if (existproperty(5, FIXES_gscSingleProperty))
  2919. {
  2920. print(FIXES_gscFixesError);
  2921. }
  2922. else
  2923. {
  2924. FIXES_gsSettings &= ~e_FIXES_SETTINGS_SECOND_USE,
  2925. setproperty(5, FIXES_gscSingleProperty, 1);
  2926. }
  2927. #endif
  2928. // =================
  2929. // BEGIN: GameText
  2930. // =================
  2931. #if FIX_GameText
  2932. for (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i)
  2933. {
  2934. FIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS;
  2935. }
  2936. #endif
  2937. #if FIXES_Single
  2938. #if FIX_GameText
  2939. _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
  2940. #endif
  2941. // =================
  2942. // END: GameText
  2943. // =================
  2944. #else
  2945. FIXES_DetermineOrder(),
  2946. FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;
  2947. #endif
  2948. #if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect
  2949. FIXES_gsSettings |= e_FIXES_SETTINGS_NO_GAME_TEXT;
  2950. #endif
  2951. // These are all the fixes that use "_FIXES_FOREACH".
  2952. #if FIX_OnPlayerConnect || _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  2953. for (new playerid = 0; playerid != MAX_PLAYERS; ++playerid)
  2954. {
  2955. if (BAD_IsPlayerConnected(playerid))
  2956. {
  2957. // No "defined" checks - if you don't want this fix because
  2958. // you don't have an "OnPlayerConnect", just don't use it!
  2959. // Of course, it helps that the copy of "OnPlayerConnect"
  2960. // in this include is almost always called!
  2961. #if FIX_OnPlayerConnect
  2962. // ========================
  2963. // BEGIN: OnPlayerConnect
  2964. // ========================
  2965. OnPlayerConnect(playerid);
  2966. // ========================
  2967. // END: OnPlayerConnect
  2968. // ========================
  2969. #else
  2970. _FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
  2971. #if FIX_GameText
  2972. // =================
  2973. // BEGIN: GameText
  2974. // =================
  2975. _FIXES_IS_IN_CHARGE()
  2976. {
  2977. _FIXES_CreateGameTextDraws(playerid);
  2978. }
  2979. // =================
  2980. // END: GameText
  2981. // =================
  2982. #endif
  2983. #endif
  2984. }
  2985. }
  2986. #endif
  2987. #if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect
  2988. FIXES_gsSettings &= ~e_FIXES_SETTINGS_NO_GAME_TEXT;
  2989. #endif
  2990. return FIXES_OnFilterScriptInit();
  2991. }
  2992. #if defined _ALS_OnFilterScriptInit
  2993. #error _ALS_OnFilterScriptInit defined
  2994. #endif
  2995. #define _ALS_OnFilterScriptInit
  2996. #define OnFilterScriptInit(%0) FIXES_OnFilterScriptInit(%0) <_ALS : _ALS_go>
  2997. _FIXES_FORWARD FIXES_OnFilterScriptInit();
  2998. /*
  2999. * OnGameModeInit()
  3000. *
  3001. * Call "FIXES_OnScriptInit" if this is not a FilterScript.
  3002. *
  3003. * FIXES:
  3004. * IS_FILTERSCRIPT
  3005. * AllowInteriorWeapons
  3006. * AllowTeleport
  3007. */
  3008. public OnGameModeInit()
  3009. {
  3010. state _ALS : _ALS_go;
  3011. #if FIXES_Single
  3012. // Check this really IS the only script running. Properties reset when
  3013. // a gamemode restarts, so we don't have to worry about filterscipts
  3014. // detecting themselves.
  3015. if (FIXES_gsSettings & e_FIXES_SETTINGS_SECOND_USE)
  3016. {
  3017. if (existproperty(5, FIXES_gscSingleProperty))
  3018. {
  3019. print(FIXES_gscFixesError);
  3020. }
  3021. else
  3022. {
  3023. setproperty(5, FIXES_gscSingleProperty, 1);
  3024. }
  3025. }
  3026. else
  3027. {
  3028. // When the server starts, we need to allow an FS to load with a GM
  3029. // that doesn't use fixes.inc. This is the only case where a
  3030. // property can be set while a ganemode isn't running. This will
  3031. // mean that the FS won't complain if they are both using fixes, but
  3032. // the GM still will, so all is good.
  3033. FIXES_gsSettings |= e_FIXES_SETTINGS_SECOND_USE;
  3034. }
  3035. #endif
  3036. // =============================
  3037. // BEGIN: AllowInteriorWeapons
  3038. // =============================
  3039. // ======================
  3040. // BEGIN: AllowTeleport
  3041. // ======================
  3042. #if FIX_AllowInteriorWeapons && FIX_AllowTeleport && !defined FILTERSCRIPT
  3043. FIXES_gsSettings &= ~(e_FIXES_SETTINGS_INTERIOR | e_FIXES_SETTINGS_ADMIN_TELEPORT);
  3044. #elseif FIX_AllowInteriorWeapons
  3045. FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
  3046. #elseif FIX_AllowTeleport && !defined FILTERSCRIPT
  3047. FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
  3048. #endif
  3049. // ======================
  3050. // END: AllowTeleport
  3051. // ======================
  3052. // ===========================
  3053. // END: AllowInteriorWeapons
  3054. // ===========================
  3055. #if FIX_GameText || !FIXES_Single
  3056. if (!_FIXES_gIsFilterscript)
  3057. {
  3058. // =================
  3059. // BEGIN: GameText
  3060. // =================
  3061. #if FIX_GameText
  3062. for (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i)
  3063. {
  3064. FIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS;
  3065. }
  3066. #if FIXES_Single
  3067. _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
  3068. #endif
  3069. #endif
  3070. // =================
  3071. // END: GameText
  3072. // =================
  3073. #if !FIXES_Single
  3074. FIXES_DetermineOrder();
  3075. #endif
  3076. }
  3077. #endif
  3078. #if !FIXES_Single
  3079. FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;
  3080. #endif
  3081. return FIXES_OnGameModeInit();
  3082. }
  3083. #if defined _ALS_OnGameModeInit
  3084. #error _ALS_OnGameModeInit defined
  3085. #endif
  3086. #define _ALS_OnGameModeInit
  3087. #define OnGameModeInit(%0) FIXES_OnGameModeInit(%0) <_ALS : _ALS_go>
  3088. _FIXES_FORWARD FIXES_OnGameModeInit();
  3089. /*
  3090. * OnGameModeExit()
  3091. *
  3092. * Fast way of detecting not to retain any data.
  3093. */
  3094. #if !FIXES_Single || FIX_PlayerDialogResponse
  3095. public OnGameModeExit()
  3096. {
  3097. #if !FIXES_Single
  3098. FIXES_gsSettings |= e_FIXES_SETTINGS_DROP_ALL_DATA;
  3099. if (!_FIXES_gIsFilterscript && FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  3100. {
  3101. FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING,
  3102. FIXES_DetermineOrder();
  3103. }
  3104. #endif
  3105. // =============================
  3106. // BEGIN: PlayerDialogResponse
  3107. // =============================
  3108. #if FIX_PlayerDialogResponse
  3109. for (new playerid = 0; playerid != MAX_PLAYERS; ++playerid)
  3110. {
  3111. ShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace);
  3112. }
  3113. #endif
  3114. // =============================
  3115. // END: PlayerDialogResponse
  3116. // =============================
  3117. return FIXES_OnGameModeExit();
  3118. }
  3119. #if defined _ALS_OnGameModeExit
  3120. #error _ALS_OnGameModeExit defined
  3121. #endif
  3122. #define _ALS_OnGameModeExit
  3123. #define OnGameModeExit(%0) FIXES_OnGameModeExit(%0) <_ALS : _ALS_go>
  3124. _FIXES_FORWARD FIXES_OnGameModeExit();
  3125. #endif
  3126. /*
  3127. * OnFilterScriptExit()
  3128. *
  3129. * Fast way of detecting not to retain any data.
  3130. */
  3131. #if !FIXES_Single || FIX_GameText || FIX_OnPlayerDisconnect
  3132. public OnFilterScriptExit()
  3133. {
  3134. #if FIX_OnPlayerDisconnect
  3135. // Removal safe loop.
  3136. for (new next, playerid = FIXES_gsPlayersIterator[MAX_PLAYERS]; playerid != MAX_PLAYERS; playerid = next)
  3137. {
  3138. next = FIXES_gsPlayersIterator[playerid],
  3139. OnPlayerDisconnect(playerid, 4);
  3140. #if FIXES_Single
  3141. // =================
  3142. // BEGIN: GameText
  3143. // =================
  3144. #if FIX_GameText
  3145. #if FIX_GameTextStyles
  3146. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
  3147. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
  3148. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
  3149. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
  3150. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
  3151. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
  3152. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
  3153. #endif
  3154. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
  3155. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
  3156. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
  3157. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
  3158. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
  3159. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
  3160. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
  3161. #endif
  3162. #endif
  3163. }
  3164. #endif
  3165. #if FIXES_Single
  3166. // =================
  3167. // BEGIN: GameText
  3168. // =================
  3169. #if FIX_GameText
  3170. #if defined FIXES_OnFilterScriptExit
  3171. FIXES_OnFilterScriptExit();
  3172. #endif
  3173. #if !FIX_OnPlayerDisconnect
  3174. _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
  3175. {
  3176. #if FIX_GameTextStyles
  3177. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
  3178. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
  3179. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
  3180. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
  3181. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
  3182. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
  3183. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
  3184. #endif
  3185. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
  3186. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
  3187. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
  3188. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
  3189. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
  3190. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
  3191. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
  3192. }
  3193. #endif
  3194. return
  3195. #if FIX_GameTextStyles
  3196. TextDrawDestroy(FIXES_gsGTStyle[13]),
  3197. TextDrawDestroy(FIXES_gsGTStyle[12]),
  3198. TextDrawDestroy(FIXES_gsGTStyle[11]),
  3199. TextDrawDestroy(FIXES_gsGTStyle[10]),
  3200. TextDrawDestroy(FIXES_gsGTStyle[9]),
  3201. TextDrawDestroy(FIXES_gsGTStyle[8]),
  3202. TextDrawDestroy(FIXES_gsGTStyle[7]),
  3203. #endif
  3204. TextDrawDestroy(FIXES_gsGTStyle[6]),
  3205. TextDrawDestroy(FIXES_gsGTStyle[5]),
  3206. TextDrawDestroy(FIXES_gsGTStyle[4]),
  3207. TextDrawDestroy(FIXES_gsGTStyle[3]),
  3208. TextDrawDestroy(FIXES_gsGTStyle[2]),
  3209. TextDrawDestroy(FIXES_gsGTStyle[1]),
  3210. TextDrawDestroy(FIXES_gsGTStyle[0]);
  3211. #else
  3212. return FIXES_OnFilterScriptExit();
  3213. #endif
  3214. // =================
  3215. // END: GameText
  3216. // =================
  3217. #else
  3218. if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  3219. {
  3220. FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING,
  3221. FIXES_DetermineOrder();
  3222. }
  3223. return FIXES_OnFilterScriptExit();
  3224. #endif
  3225. }
  3226. #if defined _ALS_OnFilterScriptExit
  3227. #error _ALS_OnFilterScriptExit defined
  3228. #endif
  3229. #define _ALS_OnFilterScriptExit
  3230. #define OnFilterScriptExit(%0) FIXES_OnFilterScriptExit(%0) <_ALS : _ALS_go>
  3231. _FIXES_FORWARD FIXES_OnFilterScriptExit();
  3232. #endif
  3233. /*
  3234. * OnPlayerCommandText(playerid, cmdtext[])
  3235. *
  3236. * FIXES:
  3237. * OnPlayerCommandText
  3238. */
  3239. #if FIX_OnPlayerCommandText
  3240. public OnPlayerCommandText(playerid, cmdtext[])
  3241. {
  3242. // ============================
  3243. // BEGIN: OnPlayerCommandText
  3244. // ============================
  3245. #if FIX_OnPlayerCommandText
  3246. // If this "#if" is around the whole function, it doesn't always
  3247. // compile properly.
  3248. return FIXES_OnPlayerCommandText(playerid, (cmdtext[0] <= '\1') ? FIXES_gscNULL : cmdtext);
  3249. #endif
  3250. // ============================
  3251. // END: OnPlayerCommandText
  3252. // ============================
  3253. }
  3254. #if defined _ALS_OnPlayerCommandText
  3255. #error _ALS_OnPlayerCommandText defined
  3256. #endif
  3257. #define _ALS_OnPlayerCommandText
  3258. #define OnPlayerCommandText(%0) FIXES_OnPlayerCommandText(%0) <_ALS : _ALS_go>
  3259. forward FIXES_OnPlayerCommandText(playerid, cmdtext[]);
  3260. public FIXES_OnPlayerCommandText(playerid, cmdtext[]) <_ALS : _ALS_x0, _ALS : _ALS_x1> { return 0; }
  3261. public FIXES_OnPlayerCommandText(playerid, cmdtext[]) <> { return 0; }
  3262. #endif
  3263. /*
  3264. * OnPlayerConnect(playerid)
  3265. *
  3266. * Almost every fix uses this callback for initialisation. It is only
  3267. * explicitly referenced for those fixes where this is all the code. The
  3268. * inclusion code was approaching the 512 line length limit, so I shrank it.
  3269. *
  3270. * FIXES:
  3271. * TogglePlayerControllable
  3272. * SetPlayerWorldBounds
  3273. * GetPlayerColor
  3274. * SetPlayerName
  3275. * GetPlayerSkin
  3276. * IsPlayerInCheckpoint
  3277. * IsPlayerInRaceCheckpoint
  3278. * GetPlayerWeapon
  3279. * PutPlayerInVehicle
  3280. * OnPlayerEnterVehicle
  3281. * AllowTeleport
  3282. * OnDialogResponse
  3283. * SetSpawnInfo
  3284. * AllowInteriorWeapons
  3285. * TrainExit
  3286. * Kick
  3287. * OnPlayerEnterVehicle_2
  3288. * PlayerDialogResponse
  3289. * OnPlayerSpawn
  3290. * ApplyAnimation_2
  3291. */
  3292. #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_SetPlayerName || FIX_GetPlayerColour
  3293. #define _FIXES_ON_PLAYER_CONNECT
  3294. #elseif FIX_GetPlayerSkin || FIX_IsPlayerInCheckpoint || FIX_IsPlayerInRaceCheckpoint || FIX_GetPlayerWeapon
  3295. #define _FIXES_ON_PLAYER_CONNECT
  3296. #elseif FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_OnDialogResponse
  3297. #define _FIXES_ON_PLAYER_CONNECT
  3298. #elseif FIX_GetPlayerDialog || FIX_SetSpawnInfo || FIX_AllowInteriorWeapons || FIX_TrainExit
  3299. #define _FIXES_ON_PLAYER_CONNECT
  3300. #elseif FIX_Kick || FIX_OnPlayerEnterVehicle_2 || FIX_PlayerDialogResponse || FIX_GetPlayerInterior
  3301. #define _FIXES_ON_PLAYER_CONNECT
  3302. #elseif FIX_OnPlayerSpawn || FIX_ApplyAnimation_2 || FIX_GameText || _FIX_Menus
  3303. #define _FIXES_ON_PLAYER_CONNECT
  3304. #elseif FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_OnPlayerConnect || FIX_SetPlayerTime
  3305. #define _FIXES_ON_PLAYER_CONNECT
  3306. #endif
  3307. #if defined _FIXES_ON_PLAYER_CONNECT
  3308. public OnPlayerConnect(playerid)
  3309. {
  3310. // =========================
  3311. // BEGIN: ApplyAnimation_2
  3312. // =========================
  3313. #if FIX_ApplyAnimation_2
  3314. FIXES_gsPlayerAnimLibs[playerid][0] =
  3315. FIXES_gsPlayerAnimLibs[playerid][1] =
  3316. FIXES_gsPlayerAnimLibs[playerid][2] =
  3317. FIXES_gsPlayerAnimLibs[playerid][3] =
  3318. FIXES_gsPlayerAnimLibs[playerid][4] = -1;
  3319. #endif
  3320. // =======================
  3321. // END: ApplyAnimation_2
  3322. // =======================
  3323. #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  3324. _FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
  3325. #endif
  3326. FIXES_PRINTF("FIXES_OnPlayerConnect: %d", playerid);
  3327. // This is only reset when the Game Mode changes or when a new
  3328. #if FIX_Kick || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_AllowInteriorWeapons || FIX_TrainExit || FIX_OnPlayerEnterVehicle_2
  3329. // player connects, which is what we want. The other items are the
  3330. // same, but must be done only once. This variable will tend to
  3331. // hold data relevant only in the master script (the first
  3332. // filterscript).
  3333. #if FIX_Kick || FIX_SetPlayerTime
  3334. FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_ON_PLAYER_CONNECT;
  3335. #else
  3336. FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_NONE;
  3337. #endif
  3338. #endif
  3339. // =================
  3340. // BEGIN: GameText
  3341. // =================
  3342. #if FIX_GameText
  3343. #if !FIXES_Single
  3344. if (FIXES_gsSettings & (e_FIXES_SETTINGS_NO_GAME_TEXT | e_FIXES_SETTINGS_IN_CHARGE) == e_FIXES_SETTINGS_IN_CHARGE)
  3345. #endif
  3346. {
  3347. _FIXES_CreateGameTextDraws(playerid);
  3348. }
  3349. #endif
  3350. // =================
  3351. // END: GameText
  3352. // =================
  3353. #if !FIXES_Single
  3354. if (!GetPVarInt(playerid, FIXES_pvarNotNewPlayer))
  3355. #endif
  3356. {
  3357. FIXES_PRINTF("FIXES_OnPlayerConnect: First (%d)", FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE);
  3358. // ======================
  3359. // BEGIN: SetPlayerName
  3360. // ======================
  3361. #if FIX_SetPlayerName
  3362. new
  3363. name[MAX_PLAYER_NAME];
  3364. GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  3365. if (strcmp(name, FIXES_gscTempName) == 0)
  3366. {
  3367. Kick(playerid);
  3368. }
  3369. #endif
  3370. // ======================
  3371. // END: SetPlayerName
  3372. // ======================
  3373. // =============================
  3374. // BEGIN: SetPlayerWorldBounds
  3375. // =============================
  3376. #if FIX_SetPlayerWorldBounds && !FIXES_Single
  3377. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] =
  3378. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] =
  3379. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] =
  3380. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] =
  3381. 0.0;
  3382. #endif
  3383. // =============================
  3384. // END: SetPlayerWorldBounds
  3385. // =============================
  3386. // =======================
  3387. // BEGIN: SetPlayerColor
  3388. // =======================
  3389. #if FIX_GetPlayerColour
  3390. SetPlayerColor(playerid, FIXES_gscPlayerColours[playerid % 100]);
  3391. #endif
  3392. // =======================
  3393. // END: SetPlayerColor
  3394. // =======================
  3395. // ======================
  3396. // BEGIN: GetPlayerSkin
  3397. // ======================
  3398. #if FIX_GetPlayerSkin
  3399. #if FIXES_Single
  3400. FIXES_gsPlayerSkin[playerid] = 0;
  3401. #else
  3402. SetPVarInt(playerid, FIXES_pvarPlayerSkin, 0);
  3403. #endif
  3404. #endif
  3405. // ======================
  3406. // END: GetPlayerSkin
  3407. // ======================
  3408. // =============================
  3409. // BEGIN: IsPlayerInCheckpoint
  3410. // =============================
  3411. #if FIX_IsPlayerInCheckpoint
  3412. DisablePlayerCheckpoint(playerid);
  3413. #endif
  3414. // =============================
  3415. // END: IsPlayerInCheckpoint
  3416. // =============================
  3417. // =================================
  3418. // BEGIN: IsPlayerInRaceCheckpoint
  3419. // =================================
  3420. #if FIX_IsPlayerInRaceCheckpoint
  3421. DisablePlayerRaceCheckpoint(playerid);
  3422. #endif
  3423. // =================================
  3424. // END: IsPlayerInRaceCheckpoint
  3425. // =================================
  3426. // ========================
  3427. // BEGIN: GetPlayerWeapon
  3428. // ========================
  3429. #if FIX_GetPlayerWeapon
  3430. #if FIXES_Single
  3431. FIXES_gsPlayerWeapon[playerid] = -1;
  3432. #else
  3433. SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);
  3434. #endif
  3435. #endif
  3436. // ========================
  3437. // END: GetPlayerWeapon
  3438. // ========================
  3439. // ==========================
  3440. // BEGIN: GetPlayerInterior
  3441. // ==========================
  3442. #if FIX_GetPlayerInterior
  3443. #if FIXES_Single
  3444. FIXES_gsInterior[playerid] = 0;
  3445. #else
  3446. SetPVarInt(playerid, FIXES_pvarPlayerInterior, 0);
  3447. #endif
  3448. #endif
  3449. // ==========================
  3450. // END: GetPlayerInterior
  3451. // ==========================
  3452. // =========================
  3453. // BEGIN: OnDialogResponse
  3454. // =========================
  3455. #if FIX_OnDialogResponse || FIX_GetPlayerDialog
  3456. #if FIXES_Single
  3457. FIXES_gsDialogID[playerid] = INVALID_DIALOG_ID;
  3458. #else
  3459. SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
  3460. #endif
  3461. #endif
  3462. // =========================
  3463. // END: OnDialogResponse
  3464. // =========================
  3465. // =============================
  3466. // BEGIN: PlayerDialogResponse
  3467. // =============================
  3468. #if FIX_PlayerDialogResponse
  3469. ShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace);
  3470. #endif
  3471. // =============================
  3472. // END: PlayerDialogResponse
  3473. // =============================
  3474. // =====================
  3475. // BEGIN: SetSpawnInfo
  3476. // =====================
  3477. #if FIX_SetSpawnInfo
  3478. SetSpawnInfo(playerid, NO_TEAM, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
  3479. #endif
  3480. // =====================
  3481. // END: SetSpawnInfo
  3482. // =====================
  3483. // ======================
  3484. // BEGIN: OnPlayerSpawn
  3485. // ======================
  3486. #if FIX_OnPlayerSpawn
  3487. #if FIXES_Single
  3488. FIXES_gsLastCash[playerid] = 0;
  3489. #else
  3490. SetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0);
  3491. #endif
  3492. #endif
  3493. // ======================
  3494. // END: OnPlayerSpawn
  3495. // ======================
  3496. #if !FIXES_Single
  3497. // No longer their first time.
  3498. SetPVarInt(playerid, FIXES_pvarNotNewPlayer, 1);
  3499. #endif
  3500. }
  3501. // =============
  3502. // BEGIN: Kick
  3503. // =============
  3504. #if FIX_Kick || FIX_SetPlayerTime
  3505. new
  3506. ret = FIXES_OnPlayerConnect(playerid);
  3507. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_ON_PLAYER_CONNECT;
  3508. return ret;
  3509. #else
  3510. return FIXES_OnPlayerConnect(playerid);
  3511. #endif
  3512. // =============
  3513. // END: Kick
  3514. // =============
  3515. }
  3516. #if defined _ALS_OnPlayerConnect
  3517. #error _ALS_OnPlayerConnect defined
  3518. #endif
  3519. #define _ALS_OnPlayerConnect
  3520. #define OnPlayerConnect(%0) FIXES_OnPlayerConnect(%0) <_ALS : _ALS_go>
  3521. _FIXES_FORWARD FIXES_OnPlayerConnect(playerid);
  3522. #endif
  3523. /*
  3524. * OnPlayerDisonnect(playerid, reason)
  3525. *
  3526. * FIXES:
  3527. * SetPlayerAttachedObject
  3528. * IsPlayerAttachedObjectSlotUsed
  3529. * Kick
  3530. * GetPlayerMenu
  3531. */
  3532. #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
  3533. public OnPlayerDisconnect(playerid, reason)
  3534. {
  3535. new
  3536. ret = FIXES_OnPlayerDisconnect(playerid, reason);
  3537. // =========================
  3538. // BEGIN: ApplyAnimation_2
  3539. // =========================
  3540. #if FIX_ApplyAnimation_2
  3541. if (FIXES_gsAnimTimer[playerid])
  3542. {
  3543. KillTimer(FIXES_gsAnimTimer[playerid]),
  3544. FIXES_gsAnimTimer[playerid] = 0;
  3545. }
  3546. #endif
  3547. // =======================
  3548. // END: ApplyAnimation_2
  3549. // =======================
  3550. // ======================
  3551. // BEGIN: GetPlayerMenu
  3552. // ======================
  3553. #if FIX_GetPlayerMenu
  3554. FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  3555. #endif
  3556. // ======================
  3557. // END: GetPlayerMenu
  3558. // ======================
  3559. // ==========================
  3560. // BEGIN: FIXES_SilentKick
  3561. // ==========================
  3562. #if FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2)
  3563. new
  3564. shift = FIXES_gsPlayerIP[playerid];
  3565. if (shift != -1)
  3566. {
  3567. // Unban the IP (timed out).
  3568. new
  3569. ip[16];
  3570. format(ip, sizeof (ip), "unbanip %d.%d.%d.%d", shift >>> 24, (shift >>> 16) & 0xFF, (shift >>> 8) & 0xFF, shift & 0xFF),
  3571. FIXES_gsPlayerIP[playerid] = -1;
  3572. }
  3573. #endif
  3574. // ==========================
  3575. // END: FIXES_SilentKick
  3576. // ==========================
  3577. // ================================
  3578. // BEGIN: SetPlayerAttachedObject
  3579. // ================================
  3580. #if FIX_SetPlayerAttachedObject
  3581. #if !(FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2))
  3582. new
  3583. #endif
  3584. shift = playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS;
  3585. #pragma tabsize 4
  3586. new
  3587. slot = playerid / _FIXES_ATTACHMENTS;
  3588. #if !FIXES_Single
  3589. if (!_FIXES_gIsFilterscript)
  3590. #endif
  3591. {
  3592. for (new i = 0; i != MAX_PLAYER_ATTACHED_OBJECTS; ++i)
  3593. {
  3594. if (FIXES_gsObjectSlots[slot] & 1 << shift + i)
  3595. {
  3596. RemovePlayerAttachedObject(playerid, i);
  3597. }
  3598. }
  3599. }
  3600. #pragma tabsize 4
  3601. FIXES_gsObjectSlots[slot] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << shift);
  3602. #endif
  3603. // ================================
  3604. // END: SetPlayerAttachedObject
  3605. // ================================
  3606. // =======================================
  3607. // BEGIN: IsPlayerAttachedObjectSlotUsed
  3608. // =======================================
  3609. #if FIX_IsPlayerAttachedObjSlotUsed && !FIX_SetPlayerAttachedObject
  3610. FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS);
  3611. #endif
  3612. // =======================================
  3613. // END: IsPlayerAttachedObjectSlotUsed
  3614. // =======================================
  3615. // =============
  3616. // BEGIN: Kick
  3617. // =============
  3618. #if FIX_Kick
  3619. if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_KICKED)
  3620. {
  3621. // Stop the timer if it is still running.
  3622. KillTimer(GetPVarInt(playerid, FIXES_pvarKick));
  3623. }
  3624. #endif
  3625. // =============
  3626. // END: Kick
  3627. // =============
  3628. #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  3629. _FIXES_RemoveInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
  3630. #endif
  3631. return ret;
  3632. }
  3633. #if defined _ALS_OnPlayerDisconnect
  3634. #error _ALS_OnPlayerDisconnect defined
  3635. #endif
  3636. #define _ALS_OnPlayerDisconnect
  3637. #define OnPlayerDisconnect(%0) FIXES_OnPlayerDisconnect(%0) <_ALS : _ALS_go>
  3638. _FIXES_FORWARD FIXES_OnPlayerDisconnect(playerid, reason);
  3639. #endif
  3640. /*
  3641. * OnPlayerDeath(playerid, killerid, reason)
  3642. *
  3643. * FIXES:
  3644. * OnPlayerDeath
  3645. * OnPlayerSpawn
  3646. */
  3647. #if FIX_OnPlayerDeath || FIX_OnPlayerSpawn
  3648. public OnPlayerDeath(playerid, killerid, reason)
  3649. {
  3650. _FIXES_IS_IN_CHARGE()
  3651. {
  3652. // ======================
  3653. // BEGIN: OnPlayerDeath
  3654. // ======================
  3655. #if FIX_OnPlayerDeath
  3656. static
  3657. sAnimlib[32],
  3658. sAnimname[32];
  3659. GetAnimationName(FIXES_gsLastAnimation[playerid], sAnimlib, sizeof (sAnimlib), sAnimname, sizeof (sAnimname));
  3660. if (strcmp(sAnimlib, "PED", true))
  3661. {
  3662. ClearAnimations(playerid);
  3663. }
  3664. #endif
  3665. // ======================
  3666. // END: OnPlayerDeath
  3667. // ======================
  3668. }
  3669. // ======================
  3670. // BEGIN: OnPlayerSpawn
  3671. // ======================
  3672. #if FIX_OnPlayerSpawn
  3673. new
  3674. ret = FIXES_OnPlayerDeath(playerid, killerid, reason);
  3675. #if FIXES_Single
  3676. FIXES_gsLastCash[playerid] = GetPlayerMoney(playerid);
  3677. #else
  3678. SetPVarInt(playerid, FIXES_pvarPlayerLastCash, GetPlayerMoney(playerid));
  3679. #endif
  3680. return ret;
  3681. #else
  3682. return FIXES_OnPlayerDeath(playerid, killerid, reason);
  3683. #endif
  3684. // ======================
  3685. // END: OnPlayerSpawn
  3686. // ======================
  3687. }
  3688. #if defined _ALS_OnPlayerDeath
  3689. #error _ALS_OnPlayerDeath defined
  3690. #endif
  3691. #define _ALS_OnPlayerDeath
  3692. #define OnPlayerDeath(%0) FIXES_OnPlayerDeath(%0) <_ALS : _ALS_go>
  3693. _FIXES_FORWARD FIXES_OnPlayerDeath(playerid, killerid, reason);
  3694. #endif
  3695. /*
  3696. * FIXES_SpawnPlayer(playerid)
  3697. *
  3698. * FIXES:
  3699. * SpawnPlayer
  3700. */
  3701. #if defined _ALS_SpawnPlayer
  3702. #error _ALS_SpawnPlayer defined
  3703. #endif
  3704. native BAD_SpawnPlayer(playerid) = SpawnPlayer;
  3705. #if FIX_SpawnPlayer
  3706. stock FIXES_SpawnPlayer(playerid)
  3707. {
  3708. // Valid "playerid" check inside "GetPlayerVehicleID".
  3709. new
  3710. vid = GetPlayerVehicleID(playerid);
  3711. if (vid)
  3712. {
  3713. new
  3714. Float:x,
  3715. Float:y,
  3716. Float:z;
  3717. // Remove them without the animation.
  3718. GetVehiclePos(vid, x, y, z),
  3719. SetPlayerPos(playerid, x, y, z);
  3720. }
  3721. return SpawnPlayer(playerid);
  3722. }
  3723. #define _ALS_SpawnPlayer
  3724. #define SpawnPlayer FIXES_SpawnPlayer
  3725. #endif
  3726. /*
  3727. * FIXES_SetPlayerName(playerid, name[])
  3728. *
  3729. * FIXES:
  3730. * SetPlayerName
  3731. */
  3732. #if defined _ALS_SetPlayerName
  3733. #error _ALS_SetPlayerName defined
  3734. #endif
  3735. native BAD_SetPlayerName(playerid, const name[]) = SetPlayerName;
  3736. #if FIX_SetPlayerName
  3737. stock FIXES_SetPlayerName(playerid, name[])
  3738. {
  3739. static
  3740. sOldName[MAX_PLAYER_NAME];
  3741. GetPlayerName(playerid, sOldName, sizeof (sOldName));
  3742. if (!strcmp(name, sOldName, true))
  3743. {
  3744. if(strcmp(name, sOldName, false))
  3745. {
  3746. SetPlayerName(playerid, FIXES_gscTempName);
  3747. if(SetPlayerName(playerid, name) == -1)
  3748. {
  3749. SetPlayerName(playerid, sOldName);
  3750. return -1;
  3751. }
  3752. return 1;
  3753. }
  3754. else
  3755. {
  3756. return 0;
  3757. }
  3758. }
  3759. return SetPlayerName(playerid, name);
  3760. }
  3761. #define _ALS_SetPlayerName
  3762. #define SetPlayerName FIXES_SetPlayerName
  3763. #endif
  3764. /*
  3765. * OnPlayerRequestClass(playerid, classid)
  3766. *
  3767. * FIXES:
  3768. * OnPlayerRequestClass
  3769. */
  3770. #if FIX_OnPlayerRequestClass
  3771. public OnPlayerRequestClass(playerid, classid)
  3772. {
  3773. // =============================
  3774. // BEGIN: OnPlayerRequestClass
  3775. // =============================
  3776. #if FIX_OnPlayerRequestClass
  3777. new
  3778. Float:x,
  3779. Float:y,
  3780. Float:z;
  3781. GetPlayerPos(playerid, x, y, z),
  3782. RemoveBuildingForPlayer(playerid, 1484, x, y, z, 10.0),
  3783. RemoveBuildingForPlayer(playerid, 1485, x, y, z, 10.0),
  3784. RemoveBuildingForPlayer(playerid, 1486, x, y, z, 10.0);
  3785. #endif
  3786. // ===========================
  3787. // END: OnPlayerRequestClass
  3788. // ===========================
  3789. return FIXES_OnPlayerRequestClass(playerid, classid);
  3790. }
  3791. #if defined _ALS_OnPlayerRequestClass
  3792. #error _ALS_OnPlayerRequestClass defined
  3793. #endif
  3794. #define _ALS_OnPlayerRequestClass
  3795. #define OnPlayerRequestClass(%0) FIXES_OnPlayerRequestClass(%0) <_ALS : _ALS_go>
  3796. _FIXES_FORWARD FIXES_OnPlayerRequestClass(playerid, classid);
  3797. #endif
  3798. /*
  3799. * OnPlayerSpawn(playerid)
  3800. *
  3801. * FIXES:
  3802. * GetPlayerSkin
  3803. * TogglePlayerControllable
  3804. * GetPlayerInterior
  3805. * OnPlayerSpawn
  3806. * GameText
  3807. */
  3808. #if FIX_GetPlayerSkin || FIX_TogglePlayerControllable || FIX_GetPlayerInterior || FIX_OnPlayerSpawn || FIX_GameText
  3809. public OnPlayerSpawn(playerid)
  3810. {
  3811. _FIXES_IS_IN_CHARGE()
  3812. {
  3813. // ======================
  3814. // BEGIN: OnPlayerSpawn
  3815. // ======================
  3816. #if FIX_OnPlayerSpawn
  3817. ResetPlayerMoney(playerid);
  3818. #if FIXES_Single
  3819. GivePlayerMoney(playerid, FIXES_gsLastCash[playerid]);
  3820. FIXES_gsLastCash[playerid] = 0;
  3821. #else
  3822. GivePlayerMoney(playerid, GetPVarInt(playerid, FIXES_pvarPlayerLastCash));
  3823. SetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0);
  3824. #endif
  3825. #endif
  3826. // ======================
  3827. // END: OnPlayerSpawn
  3828. // ======================
  3829. // ==========================
  3830. // BEGIN: GetPlayerInterior
  3831. // ==========================
  3832. #if FIX_GetPlayerInterior
  3833. #if FIXES_Single
  3834. FIXES_gsInterior[playerid] = 0;
  3835. #else
  3836. SetPVarInt(playerid, FIXES_pvarPlayerInterior, 0);
  3837. #endif
  3838. #endif
  3839. // ==========================
  3840. // END: GetPlayerInterior
  3841. // ==========================
  3842. // =================
  3843. // BEGIN: GameText
  3844. // =================
  3845. #if FIX_GameText
  3846. // Per-player GTs.
  3847. #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)
  3848. #if FIX_GameTextStyles
  3849. _FIXES_PER_PLAYER_GT(13);
  3850. _FIXES_PER_PLAYER_GT(12);
  3851. _FIXES_PER_PLAYER_GT(11);
  3852. _FIXES_PER_PLAYER_GT(10);
  3853. _FIXES_PER_PLAYER_GT(9);
  3854. _FIXES_PER_PLAYER_GT(8);
  3855. _FIXES_PER_PLAYER_GT(7);
  3856. #endif
  3857. _FIXES_PER_PLAYER_GT(6);
  3858. _FIXES_PER_PLAYER_GT(5);
  3859. _FIXES_PER_PLAYER_GT(4);
  3860. _FIXES_PER_PLAYER_GT(3);
  3861. _FIXES_PER_PLAYER_GT(2);
  3862. _FIXES_PER_PLAYER_GT(1);
  3863. _FIXES_PER_PLAYER_GT(0);
  3864. #undef _FIXES_PER_PLAYER_GT
  3865. // Global GTs.
  3866. #if FIX_GameTextStyles
  3867. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[13]),
  3868. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[12]),
  3869. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[11]),
  3870. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[10]),
  3871. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[9]),
  3872. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[8]),
  3873. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[7]);
  3874. #endif
  3875. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[6]),
  3876. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[5]),
  3877. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[4]),
  3878. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[3]),
  3879. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[2]),
  3880. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[1]),
  3881. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[0]);
  3882. #endif
  3883. // =================
  3884. // END: GameText
  3885. // =================
  3886. }
  3887. // ======================
  3888. // BEGIN: GetPlayerSkin
  3889. // ======================
  3890. #if FIX_GetPlayerSkin
  3891. #if FIXES_Single
  3892. FIXES_gsPlayerSkin[playerid] = GetPlayerSkin(playerid);
  3893. #else
  3894. SetPVarInt(playerid, FIXES_pvarPlayerSkin, GetPlayerSkin(playerid));
  3895. #endif
  3896. #endif
  3897. // ======================
  3898. // END: GetPlayerSkin
  3899. // ======================
  3900. // =================================
  3901. // BEGIN: TogglePlayerControllable
  3902. // =================================
  3903. #if FIX_TogglePlayerControllable
  3904. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
  3905. #endif
  3906. // =================================
  3907. // END: TogglePlayerControllable
  3908. // =================================
  3909. return FIXES_OnPlayerSpawn(playerid);
  3910. }
  3911. #if defined _ALS_OnPlayerSpawn
  3912. #error _ALS_OnPlayerSpawn defined
  3913. #endif
  3914. #define _ALS_OnPlayerSpawn
  3915. #define OnPlayerSpawn(%0) FIXES_OnPlayerSpawn(%0) <_ALS : _ALS_go>
  3916. _FIXES_FORWARD FIXES_OnPlayerSpawn(playerid);
  3917. #endif
  3918. /*
  3919. * OnVehicleMod(playerid, vehicleid, componentid)
  3920. *
  3921. * FIXES:
  3922. * OnVehicleMod
  3923. */
  3924. #if FIX_OnVehicleMod
  3925. public OnVehicleMod(playerid, vehicleid, componentid)
  3926. {
  3927. #if !FIXES_Single
  3928. if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
  3929. {
  3930. return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
  3931. }
  3932. #endif
  3933. // =====================
  3934. // BEGIN: OnVehicleMod
  3935. // =====================
  3936. new
  3937. modelid = GetVehicleModel(vehicleid);
  3938. if (_FIXES_IN_RANGE(modelid, 400, 611 + 1))
  3939. {
  3940. switch (componentid)
  3941. {
  3942. case 1000 .. 1191:
  3943. {
  3944. if (FIXES_gscVehicleMods[(modelid - 400) * 6 + (componentid - 1000 >>> 5)] & 1 << (componentid - 1000 & 0b00011111))
  3945. {
  3946. return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
  3947. }
  3948. }
  3949. case 1192, 1193:
  3950. {
  3951. if (modelid == 576)
  3952. {
  3953. // This save a whole cell off EVERY other vehicle! This
  3954. // is the ONLY vehicle with any mods over "6 * 32 + 999"
  3955. // (1191), the highest value you can fit in 6 cells of a
  3956. // bit array (minus 1000).
  3957. return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
  3958. }
  3959. }
  3960. }
  3961. }
  3962. // Desync the player entirely.
  3963. FIXES_BlockUpdate(playerid, true);
  3964. return 0;
  3965. // =====================
  3966. // END: OnVehicleMod
  3967. // =====================
  3968. }
  3969. #if defined _ALS_OnVehicleMod
  3970. #error _ALS_OnVehicleMod defined
  3971. #endif
  3972. #define _ALS_OnVehicleMod
  3973. #define OnVehicleMod(%0) FIXES_OnVehicleMod(%0) <_ALS : _ALS_go>
  3974. _FIXES_FORWARD FIXES_OnVehicleMod(playerid, vehicleid, componentid);
  3975. #endif
  3976. /*
  3977. * FIXES_SetPlayerSkin(playerid, skinid)
  3978. *
  3979. * FIXES:
  3980. * GetPlayerSkin
  3981. * SetPlayerSkin
  3982. */
  3983. #if defined _ALS_SetPlayerSkin
  3984. #error _ALS_SetPlayerSkin defined
  3985. #endif
  3986. native BAD_SetPlayerSkin(playerid, skinid) = SetPlayerSkin;
  3987. #if FIX_GetPlayerSkin || FIX_SetPlayerSkin
  3988. stock FIXES_SetPlayerSkin(playerid, skinid)
  3989. {
  3990. // ======================
  3991. // BEGIN: SetPlayerSkin
  3992. // ======================
  3993. #if FIX_SetPlayerSkin
  3994. new
  3995. vehicleid = GetPlayerVehicleID(playerid);
  3996. if (vehicleid)
  3997. {
  3998. new
  3999. seat = GetPlayerVehicleSeat(playerid);
  4000. ClearAnimations(playerid);
  4001. new
  4002. ret = SetPlayerSkin(playerid, skinid);
  4003. PutPlayerInVehicle(playerid, vehicleid, seat);
  4004. // ======================
  4005. // BEGIN: GetPlayerSkin
  4006. // ======================
  4007. #if FIX_GetPlayerSkin
  4008. #if FIXES_Single
  4009. FIXES_gsPlayerSkin[playerid] = skinid;
  4010. #else
  4011. SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);
  4012. #endif
  4013. #endif
  4014. // ======================
  4015. // END: GetPlayerSkin
  4016. // ======================
  4017. return ret;
  4018. }
  4019. // ======================
  4020. // BEGIN: GetPlayerSkin
  4021. // ======================
  4022. #if FIX_GetPlayerSkin
  4023. else
  4024. #endif
  4025. // ======================
  4026. // END: GetPlayerSkin
  4027. // ======================
  4028. #endif
  4029. // ======================
  4030. // END: SetPlayerSkin
  4031. // ======================
  4032. // ======================
  4033. // BEGIN: GetPlayerSkin
  4034. // ======================
  4035. #if FIX_GetPlayerSkin
  4036. // Watch fot the "else" above if this code ever changes.
  4037. #if FIXES_Single
  4038. FIXES_gsPlayerSkin[playerid] = skinid;
  4039. #else
  4040. SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);
  4041. #endif
  4042. #endif
  4043. // ======================
  4044. // END: GetPlayerSkin
  4045. // ======================
  4046. return SetPlayerSkin(playerid, skinid);
  4047. }
  4048. #define _ALS_SetPlayerSkin
  4049. #define SetPlayerSkin FIXES_SetPlayerSkin
  4050. #endif
  4051. /*
  4052. * FIXES_GetPlayerSkin(playerid, skinid)
  4053. *
  4054. * FIXES:
  4055. * GetPlayerSkin
  4056. */
  4057. #if defined _ALS_GetPlayerSkin
  4058. #error _ALS_GetPlayerSkin defined
  4059. #endif
  4060. native BAD_GetPlayerSkin(playerid) = GetPlayerSkin;
  4061. #if FIX_GetPlayerSkin
  4062. stock FIXES_GetPlayerSkin(playerid)
  4063. {
  4064. #if FIXES_Single
  4065. return FIXES_gsPlayerSkin[playerid];
  4066. #else
  4067. return GetPVarInt(playerid, FIXES_pvarPlayerSkin);
  4068. #endif
  4069. }
  4070. #define _ALS_GetPlayerSkin
  4071. #define GetPlayerSkin FIXES_GetPlayerSkin
  4072. #endif
  4073. /*
  4074. * FIXES_GetWeaponName(weaponid, weapon[], len)
  4075. *
  4076. * FIXES:
  4077. * GetWeaponName
  4078. */
  4079. #if defined _ALS_GetWeaponName
  4080. #error _ALS_GetWeaponName defined
  4081. #endif
  4082. native BAD_GetWeaponName(weaponid, weapon[], len) = GetWeaponName;
  4083. #if FIX_GetWeaponName
  4084. stock FIXES_GetWeaponName(weaponid, weapon[], len)
  4085. {
  4086. switch (weaponid)
  4087. {
  4088. case 18:
  4089. {
  4090. return
  4091. weapon[0] = 0,
  4092. strcat(weapon, "Molotov Cocktail", len),
  4093. 1;
  4094. }
  4095. case 44:
  4096. {
  4097. return
  4098. weapon[0] = 0,
  4099. strcat(weapon, "Thermal Goggles", len),
  4100. 1;
  4101. }
  4102. case 45:
  4103. {
  4104. return
  4105. weapon[0] = 0,
  4106. strcat(weapon, "Night Vision Goggles", len),
  4107. 1;
  4108. }
  4109. default:
  4110. {
  4111. return GetWeaponName(weaponid, weapon, len);
  4112. }
  4113. }
  4114. return 0;
  4115. }
  4116. #define _ALS_GetWeaponName
  4117. #define GetWeaponName FIXES_GetWeaponName
  4118. #endif
  4119. /*
  4120. * OnPlayerUpdate(playerid)
  4121. *
  4122. * FIXES:
  4123. * SetPlayerWorldBounds
  4124. * TogglePlayerControllable
  4125. * AllowInteriorWeapons
  4126. * OnPlayerDeath
  4127. * Kick
  4128. * OnVehicleMod
  4129. * OnPlayerEnterVehicle
  4130. * OnPlayerEnterVehicle_2
  4131. */
  4132. #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_AllowInteriorWeapons || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_OnPlayerDeath || FIX_Kick || FIX_OnVehicleMod
  4133. public OnPlayerUpdate(playerid)
  4134. {
  4135. // =============================
  4136. // BEGIN: OnPlayerEnterVehicle
  4137. // =============================
  4138. #if FIX_OnPlayerEnterVehicle || FIX_Kick || FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle_2
  4139. if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_BLOCK)
  4140. {
  4141. return 0;
  4142. }
  4143. #endif
  4144. // =============================
  4145. // END: OnPlayerEnterVehicle
  4146. // =============================
  4147. #if !FIXES_Single
  4148. if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
  4149. {
  4150. return FIXES_OnPlayerUpdate(playerid);
  4151. }
  4152. #endif
  4153. #if FIX_OnPlayerEnterVehicle || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  4154. new
  4155. e_FIXES_BOOLS:pbools = FIXES_gsPlayerBools[playerid];
  4156. #endif
  4157. // =============================
  4158. // BEGIN: AllowInteriorWeapons
  4159. // =============================
  4160. #if FIX_AllowInteriorWeapons
  4161. if (pbools & e_FIXES_BOOLS_INTERIOR)
  4162. {
  4163. // DONE: May need integration with "FIX_GetPlayerWeapon".
  4164. SetPlayerArmedWeapon(playerid, 0);
  4165. }
  4166. #endif
  4167. // ============================
  4168. // END: AllowInteriorWeapons
  4169. // ============================
  4170. #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  4171. new
  4172. ud,
  4173. lr,
  4174. keys;
  4175. GetPlayerKeys(playerid, keys, ud, lr);
  4176. #endif
  4177. #if FIX_SetPlayerWorldBounds && !FIX_TogglePlayerControllable
  4178. #pragma unused ud, lr
  4179. #endif
  4180. // =============================
  4181. // BEGIN: SetPlayerWorldBounds
  4182. // =============================
  4183. #if FIX_SetPlayerWorldBounds
  4184. if (pbools & e_FIXES_BOOLS_WORLDBOUNDS && keys & _FIXES_KEY_AIM)
  4185. {
  4186. new
  4187. Float:x,
  4188. Float:y,
  4189. Float:z;
  4190. GetPlayerPos(playerid, x, y, z);
  4191. 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])
  4192. {
  4193. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = x,
  4194. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = y,
  4195. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = z;
  4196. }
  4197. else
  4198. {
  4199. 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]);
  4200. }
  4201. }
  4202. #endif
  4203. // =============================
  4204. // END: SetPlayerWorldBounds
  4205. // =============================
  4206. // ======================
  4207. // BEGIN: OnPlayerDeath
  4208. // ======================
  4209. #if FIX_OnPlayerDeath
  4210. FIXES_gsLastAnimation[playerid] = GetPlayerAnimationIndex(playerid);
  4211. #endif
  4212. // ======================
  4213. // END: OnPlayerDeath
  4214. // ======================
  4215. // =================================
  4216. // BEGIN: TogglePlayerControllable
  4217. // =================================
  4218. #if FIX_TogglePlayerControllable
  4219. // MUST come last.
  4220. if (pbools & e_FIXES_BOOLS_UNCONTROLLABLE)
  4221. {
  4222. // Keys based sync blocking, modified based on a post by Slice:
  4223. // http://forum.sa-mp.com/showpost.php?p=876854 Use "playerid"
  4224. // here as it's a variable that already exists, but note that
  4225. // after this point, you CANNOT use "playerid" as it has been
  4226. // "clobbered" (and yes, that's the technical term). This is
  4227. // just to avoid "statement has no effect" warnings. ALWAYS
  4228. // return 0 in this case, regardless of what other callbacks
  4229. // return.
  4230. playerid = FIXES_OnPlayerUpdate(playerid);
  4231. if (keys || ud || lr)
  4232. {
  4233. return 0;
  4234. }
  4235. else
  4236. {
  4237. return playerid;
  4238. }
  4239. }
  4240. #endif
  4241. // =================================
  4242. // END: TogglePlayerControllable
  4243. // =================================
  4244. return FIXES_OnPlayerUpdate(playerid);
  4245. }
  4246. #if defined _ALS_OnPlayerUpdate
  4247. #error _ALS_OnPlayerUpdate defined
  4248. #endif
  4249. #define _ALS_OnPlayerUpdate
  4250. #define OnPlayerUpdate(%0) FIXES_OnPlayerUpdate(%0) <_ALS : _ALS_go>
  4251. _FIXES_FORWARD FIXES_OnPlayerUpdate(playerid);
  4252. #endif
  4253. /*
  4254. * FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  4255. *
  4256. * TODO: Modify this to remove aim animations when they get to the boundaries.
  4257. *
  4258. * FIXES:
  4259. * SetPlayerWorldBounds
  4260. */
  4261. #if defined _ALS_SetPlayerWorldBounds
  4262. #error _ALS_SetPlayerWorldBounds defined
  4263. #endif
  4264. native BAD_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) = SetPlayerWorldBounds;
  4265. #if FIX_SetPlayerWorldBounds
  4266. #if FIXES_Single
  4267. stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  4268. {
  4269. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  4270. {
  4271. FIXES_PRINTF("Call SetPlayerWorldBounds");
  4272. if (x_max == x_min || y_max == y_min)
  4273. {
  4274. // Impossibly small area, disable checks entirely.
  4275. return
  4276. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS,
  4277. SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY);
  4278. }
  4279. // This code could do with a way to mostly remove the checks. Maybe
  4280. // when setting everything to FIXES_INFINITY (with default
  4281. // parameters).
  4282. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;
  4283. new
  4284. Float:tmp;
  4285. if (x_max < x_min)
  4286. {
  4287. tmp = x_min,
  4288. x_min = x_max,
  4289. x_max = tmp;
  4290. }
  4291. if (y_max < y_min)
  4292. {
  4293. tmp = y_min,
  4294. y_min = y_max,
  4295. y_max = tmp;
  4296. }
  4297. // Give a little leway so this fix isn't noticed if you're not
  4298. // trying to break through the world bounds. Leway removed in
  4299. // favour of keys.
  4300. return
  4301. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min,
  4302. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max,
  4303. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min,
  4304. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max,
  4305. GetPlayerPos(playerid, tmp, tmp, tmp),
  4306. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min,
  4307. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min,
  4308. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp,
  4309. SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min);
  4310. }
  4311. return 0;
  4312. }
  4313. #else
  4314. forward _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min);
  4315. stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  4316. {
  4317. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  4318. {
  4319. FIXES_PRINTF("Call SetPlayerWorldBounds");
  4320. return
  4321. CallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@iffff, playerid, x_max, x_min, y_max, y_min),
  4322. getproperty(5, FIXES_gscReturnProperty);
  4323. }
  4324. return 0;
  4325. }
  4326. public _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  4327. {
  4328. FIXES_PRINTF("_FIXES_SetPlayerWorldBounds: %d %.2f %.2f %.2f %.2f", playerid, x_max, x_min, y_max, y_min);
  4329. _FIXES_IS_IN_CHARGE()
  4330. {
  4331. FIXES_PRINTF("SetPlayerWorldBounds");
  4332. //if (x_max == _FIXES_INFINITY && x_min == _FIXES_INFINITY && y_max == _FIXES_INFINITY && y_min == _FIXES_INFINITY)
  4333. if (x_max == x_min || y_max == y_min)
  4334. {
  4335. // Impossibly small area, disable checks entirely.
  4336. return
  4337. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS,
  4338. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] =
  4339. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] =
  4340. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] =
  4341. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] =
  4342. 0.0,
  4343. setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY)),
  4344. -1;
  4345. }
  4346. // This code could do with a way to mostly remove the checks. Maybe
  4347. // when setting everything to FIXES_INFINITY (with default
  4348. // parameters).
  4349. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;
  4350. new
  4351. Float:tmp;
  4352. if (x_max < x_min)
  4353. {
  4354. tmp = x_min,
  4355. x_min = x_max,
  4356. x_max = tmp;
  4357. }
  4358. if (y_max < y_min)
  4359. {
  4360. tmp = y_min,
  4361. y_min = y_max,
  4362. y_max = tmp;
  4363. }
  4364. // Give a little leway so this fix isn't noticed if you're not
  4365. // trying to break through the world bounds. Leway removed in
  4366. // favour of keys.
  4367. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min,
  4368. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max,
  4369. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min,
  4370. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max,
  4371. GetPlayerPos(playerid, tmp, tmp, tmp),
  4372. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min,
  4373. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min,
  4374. FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp,
  4375. setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min));
  4376. }
  4377. return 0;
  4378. }
  4379. #endif
  4380. #define _ALS_SetPlayerWorldBounds
  4381. #define SetPlayerWorldBounds FIXES_SetPlayerWorldBounds
  4382. #endif
  4383. /*
  4384. * FIXES_TogglePlayerControllable(playerid, toggle)
  4385. *
  4386. * FIXES:
  4387. * TogglePlayerControllable
  4388. */
  4389. #if defined _ALS_TogglePlayerControllable
  4390. #error _ALS_TogglePlayerControllable defined
  4391. #endif
  4392. native BAD_TogglePlayerControllable(playerid, toggle) = TogglePlayerControllable;
  4393. #if FIX_TogglePlayerControllable
  4394. #if FIXES_Single
  4395. stock FIXES_TogglePlayerControllable(playerid, toggle)
  4396. {
  4397. if (TogglePlayerControllable(playerid, toggle))
  4398. {
  4399. if (toggle)
  4400. {
  4401. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
  4402. }
  4403. else
  4404. {
  4405. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;
  4406. }
  4407. return 1;
  4408. }
  4409. return 0;
  4410. }
  4411. #else
  4412. forward _FIXES_TogglePlayerControllable(playerid, toggle);
  4413. stock FIXES_TogglePlayerControllable(playerid, toggle)
  4414. {
  4415. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  4416. {
  4417. return
  4418. CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, playerid, toggle),
  4419. getproperty(5, FIXES_gscReturnProperty);
  4420. }
  4421. return 0;
  4422. }
  4423. public _FIXES_TogglePlayerControllable(playerid, toggle)
  4424. {
  4425. _FIXES_IS_IN_CHARGE()
  4426. {
  4427. if (toggle)
  4428. {
  4429. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
  4430. }
  4431. else
  4432. {
  4433. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;
  4434. }
  4435. setproperty(5, FIXES_gscReturnProperty, TogglePlayerControllable(playerid, toggle));
  4436. }
  4437. }
  4438. #endif
  4439. #define _ALS_TogglePlayerControllable
  4440. #define TogglePlayerControllable FIXES_TogglePlayerControllable
  4441. #endif
  4442. /*
  4443. * OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  4444. *
  4445. * FIXES:
  4446. * AllowInteriorWeapons
  4447. * GetPlayerInterior
  4448. */
  4449. #if FIX_AllowInteriorWeapons || FIX_GetPlayerInterior
  4450. public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  4451. {
  4452. // ==========================
  4453. // BEGIN: GetPlayerInterior
  4454. // ==========================
  4455. #if FIX_GetPlayerInterior
  4456. #if FIXES_Single
  4457. FIXES_gsInterior[playerid] = newinteriorid;
  4458. #else
  4459. _FIXES_IS_IN_CHARGE()
  4460. {
  4461. SetPVarInt(playerid, FIXES_pvarPlayerInterior, newinteriorid);
  4462. }
  4463. #endif
  4464. #endif
  4465. // ==========================
  4466. // END: GetPlayerInterior
  4467. // ==========================
  4468. // =============================
  4469. // BEGIN: AllowInteriorWeapons
  4470. // =============================
  4471. #if FIX_AllowInteriorWeapons
  4472. if (newinteriorid)
  4473. {
  4474. if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR)
  4475. {
  4476. // This only needs doing here if "GetPlayerWeapon" is set.
  4477. // If it isn't, even though "AllowInteriorWeapons" can use
  4478. // this code on its own, it doesn't as "OnPlayerUpdate"
  4479. // takes care of it all.
  4480. // TODO: Rewrite this code to use a single bit to indicate
  4481. // if a player can have a weapon or not, and just use the in
  4482. // the "OnPlayerUpdate" callback, instead of several checks.
  4483. // DONE!
  4484. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_INTERIOR;
  4485. _FIXES_IS_IN_CHARGE()
  4486. {
  4487. SetPlayerArmedWeapon(playerid, 0);
  4488. #if FIX_GetPlayerWeapon
  4489. if (IsPlayerInAnyVehicle(playerid))
  4490. {
  4491. #if FIXES_Single
  4492. FIXES_gsPlayerWeapon[playerid] = 0;
  4493. #else
  4494. SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
  4495. #endif
  4496. }
  4497. #endif
  4498. }
  4499. }
  4500. }
  4501. else
  4502. {
  4503. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_INTERIOR;
  4504. }
  4505. #endif
  4506. // ===========================
  4507. // END: AllowInteriorWeapons
  4508. // ===========================
  4509. return FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
  4510. }
  4511. #if defined _ALS_OnPlayerInteriorChange
  4512. #error _ALS_OnPlayerInteriorChange defined
  4513. #endif
  4514. #define _ALS_OnPlayerInteriorChange
  4515. #define OnPlayerInteriorChange(%0) FIXES_OnPlayerInteriorChange(%0) <_ALS : _ALS_go>
  4516. _FIXES_FORWARD FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
  4517. #endif
  4518. /*
  4519. * _FIXES_DriveBy(playerid)
  4520. *
  4521. * FIXES:
  4522. * DriveBy
  4523. */
  4524. #if FIX_DriveBy
  4525. forward _FIXES_DriveBy(playerid);
  4526. public _FIXES_DriveBy(playerid)
  4527. {
  4528. if (GetPlayerState(playerid) == PLAYER_STATE_PASSENGER)
  4529. {
  4530. SetPlayerArmedWeapon(playerid, FIXES_gsDriveByWeapon[playerid]);
  4531. }
  4532. return FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_DRIVE_BY;
  4533. }
  4534. #endif
  4535. /*
  4536. * OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  4537. *
  4538. * FIXES:
  4539. * DriveBy
  4540. */
  4541. #if FIX_DriveBy
  4542. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  4543. {
  4544. // ===============================
  4545. // BEGIN: DriveBy
  4546. // ===============================
  4547. #if FIX_DriveBy
  4548. #if !FIXES_Single
  4549. if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  4550. #endif
  4551. {
  4552. if ((newkeys & KEY_CROUCH) && !(oldkeys & KEY_CROUCH) && GetPlayerState(playerid) == PLAYER_STATE_PASSENGER && GetPlayerCameraMode(playerid) == 55 && !(FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_DRIVE_BY))
  4553. {
  4554. FIXES_gsDriveByWeapon[playerid] = GetPlayerWeapon(playerid),
  4555. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_DRIVE_BY,
  4556. SetPlayerArmedWeapon(playerid, 0),
  4557. ApplyAnimation(playerid, "PED", "CAR_GETIN_RHS", 4.1, 0, 0, 0, 0, 1, 1),
  4558. SetTimerEx(FIXES_gscDriveBy, 500, 0, FIXES_gscSpec@i, playerid);
  4559. }
  4560. }
  4561. #endif
  4562. // =============================
  4563. // END: DriveBy
  4564. // =============================
  4565. return FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  4566. }
  4567. #if defined _ALS_OnPlayerKeyStateChange
  4568. #error _ALS_OnPlayerKeyStateChange defined
  4569. #endif
  4570. #define _ALS_OnPlayerKeyStateChange
  4571. #define OnPlayerKeyStateChange(%0) FIXES_OnPlayerKeyStateChange(%0) <_ALS : _ALS_go>
  4572. _FIXES_FORWARD FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  4573. #endif
  4574. /*
  4575. * OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  4576. *
  4577. * FIXES:
  4578. * OnPlayerEnterVehicle_2
  4579. */
  4580. #if FIX_OnPlayerEnterVehicle_2
  4581. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  4582. {
  4583. // ===============================
  4584. // BEGIN: OnPlayerEnterVehicle_2
  4585. // ===============================
  4586. #if FIX_OnPlayerEnterVehicle_2
  4587. if (0 < vehicleid < MAX_VEHICLES)
  4588. {
  4589. return FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
  4590. }
  4591. FIXES_BlockUpdate(playerid, true);
  4592. return 0;
  4593. #endif
  4594. // =============================
  4595. // END: OnPlayerEnterVehicle_2
  4596. // =============================
  4597. }
  4598. #if defined _ALS_OnPlayerEnterVehicle
  4599. #error _ALS_OnPlayerEnterVehicle defined
  4600. #endif
  4601. #define _ALS_OnPlayerEnterVehicle
  4602. #define OnPlayerEnterVehicle(%0) FIXES_OnPlayerEnterVehicle(%0) <_ALS : _ALS_go>
  4603. _FIXES_FORWARD FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
  4604. #endif
  4605. /*
  4606. * OnPlayerExitVehicle(playerid, vehicleid)
  4607. *
  4608. * FIXES:
  4609. * OnPlayerEnterVehicle_2
  4610. */
  4611. #if FIX_OnPlayerEnterVehicle_2
  4612. public OnPlayerExitVehicle(playerid, vehicleid)
  4613. {
  4614. // ===============================
  4615. // BEGIN: OnPlayerEnterVehicle_2
  4616. // ===============================
  4617. #if FIX_OnPlayerEnterVehicle_2
  4618. if (0 < vehicleid < MAX_VEHICLES)
  4619. {
  4620. return FIXES_OnPlayerExitVehicle(playerid, vehicleid);
  4621. }
  4622. FIXES_BlockUpdate(playerid, true);
  4623. return 0;
  4624. #endif
  4625. // =============================
  4626. // END: OnPlayerEnterVehicle_2
  4627. // =============================
  4628. }
  4629. #if defined _ALS_OnPlayerExitVehicle
  4630. #error _ALS_OnPlayerExitVehicle defined
  4631. #endif
  4632. #define _ALS_OnPlayerExitVehicle
  4633. #define OnPlayerExitVehicle(%0) FIXES_OnPlayerExitVehicle(%0) <_ALS : _ALS_go>
  4634. _FIXES_FORWARD FIXES_OnPlayerExitVehicle(playerid, vehicleid);
  4635. #endif
  4636. /*
  4637. * FIXES_BlockUpdate(playerid, bool:block)
  4638. *
  4639. * Block a player from using OnPlayerUpdate at all.
  4640. */
  4641. #if FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_Kick || FIX_OnVehicleMod
  4642. static stock FIXES_BlockUpdate(playerid, bool:block, kick = 6)
  4643. {
  4644. if (kick)
  4645. {
  4646. #if FIXES_SilentKick
  4647. new
  4648. ip[22];
  4649. GetPlayerIp(playerid, ip, sizeof (ip)),
  4650. format(ip, sizeof (ip), "banip %s", ip),
  4651. SendRconCommand(ip),
  4652. FIXES_gsPlayerIP[playerid] = strval(ip[kick]) << 24,
  4653. kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
  4654. FIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 16,
  4655. kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
  4656. FIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 8,
  4657. kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
  4658. FIXES_gsPlayerIP[playerid] |= strval(ip[kick]);
  4659. #else
  4660. Kick(playerid);
  4661. #endif
  4662. }
  4663. if (block)
  4664. {
  4665. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_BLOCK;
  4666. return 0;
  4667. }
  4668. else
  4669. {
  4670. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_BLOCK;
  4671. return 1;
  4672. }
  4673. }
  4674. #endif
  4675. /*
  4676. * OnPlayerSelectedMenuRow(playerid, row)
  4677. *
  4678. * FIXES:
  4679. * GetPlayerMenu
  4680. */
  4681. #if FIX_GetPlayerMenu
  4682. public OnPlayerSelectedMenuRow(playerid, row)
  4683. {
  4684. // ======================
  4685. // BEGIN: GetPlayerMenu
  4686. // ======================
  4687. #if FIXES_Single
  4688. FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  4689. new
  4690. ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
  4691. if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  4692. {
  4693. FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  4694. }
  4695. return ret;
  4696. #else
  4697. new
  4698. Menu:cur = FIXES_gsCurrentMenu[playerid];
  4699. _FIXES_IS_IN_CHARGE()
  4700. {
  4701. setproperty(5, FIXES_gscMenuProperty, _:cur);
  4702. CallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid);
  4703. FIXES_gsCurrentMenu[playerid] = cur;
  4704. new
  4705. ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
  4706. if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  4707. {
  4708. FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  4709. }
  4710. return ret;
  4711. }
  4712. else
  4713. {
  4714. FIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty);
  4715. FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  4716. new
  4717. ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
  4718. if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  4719. {
  4720. FIXES_gsCurrentMenu[playerid] = cur;
  4721. }
  4722. return ret;
  4723. }
  4724. #endif
  4725. // ======================
  4726. // END: GetPlayerMenu
  4727. // ======================
  4728. }
  4729. #if defined _ALS_OnPlayerSelectedMenuRow
  4730. #error _ALS_OnPlayerSelectedMenuRow defined
  4731. #endif
  4732. #define _ALS_OnPlayerSelectedMenuRow
  4733. #define OnPlayerSelectedMenuRow(%0) FIXES_OnPlayerSelectedMenuRow(%0) <_ALS : _ALS_go>
  4734. _FIXES_FORWARD FIXES_OnPlayerSelectedMenuRow(playerid, row);
  4735. #endif
  4736. /*
  4737. * OnPlayerExitedMenu(playerid)
  4738. *
  4739. * FIXES:
  4740. * GetPlayerMenu
  4741. */
  4742. #if FIX_GetPlayerMenu
  4743. public OnPlayerExitedMenu(playerid)
  4744. {
  4745. // ======================
  4746. // BEGIN: GetPlayerMenu
  4747. // ======================
  4748. #if FIXES_Single
  4749. FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  4750. new
  4751. ret = FIXES_OnPlayerExitedMenu(playerid);
  4752. if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  4753. {
  4754. FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  4755. }
  4756. return ret;
  4757. #else
  4758. new
  4759. Menu:cur = FIXES_gsCurrentMenu[playerid];
  4760. _FIXES_IS_IN_CHARGE()
  4761. {
  4762. setproperty(5, FIXES_gscMenuProperty, _:cur);
  4763. CallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid);
  4764. FIXES_gsCurrentMenu[playerid] = cur;
  4765. new
  4766. ret = FIXES_OnPlayerExitedMenu(playerid);
  4767. if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  4768. {
  4769. FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  4770. }
  4771. return ret;
  4772. }
  4773. else
  4774. {
  4775. FIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty);
  4776. FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  4777. new
  4778. ret = FIXES_OnPlayerExitedMenu(playerid);
  4779. if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  4780. {
  4781. FIXES_gsCurrentMenu[playerid] = cur;
  4782. }
  4783. return ret;
  4784. }
  4785. #endif
  4786. // ======================
  4787. // END: GetPlayerMenu
  4788. // ======================
  4789. }
  4790. #if defined _ALS_OnPlayerExitedMenu
  4791. #error _ALS_OnPlayerExitedMenu defined
  4792. #endif
  4793. #define _ALS_OnPlayerExitedMenu
  4794. #define OnPlayerExitedMenu(%0) FIXES_OnPlayerExitedMenu(%0) <_ALS : _ALS_go>
  4795. _FIXES_FORWARD FIXES_OnPlayerExitedMenu(playerid);
  4796. #endif
  4797. /*
  4798. * FIXES_IS_VALID_MENU(Menu:menuid)
  4799. *
  4800. * FIXES:
  4801. * Menus
  4802. */
  4803. #if _FIX_Menus
  4804. #define FIXES_IS_VALID_MENU(%0) (_FIXES_IN_RANGE(_:(%0), 0, MAX_MENUS) && (FIXES_gsValidMenus[_:(%0) >>> 5] & (1 << (_:(%0) & 0x1F))))
  4805. #endif
  4806. /*
  4807. * Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0)
  4808. *
  4809. * FIXES:
  4810. * Menus
  4811. */
  4812. #if defined _ALS_CreateMenu
  4813. #error _ALS_CreateMenu defined
  4814. #endif
  4815. native Menu:BAD_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0) = CreateMenu;
  4816. #if _FIX_Menus
  4817. #if !FIXES_Single
  4818. forward _FIXES_CreateMenu(ret);
  4819. public _FIXES_CreateMenu(ret)
  4820. {
  4821. FIXES_gsValidMenus[ret >>> 5] |= 1 << (ret & 0x1F);
  4822. }
  4823. #endif
  4824. stock Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0)
  4825. {
  4826. new
  4827. Menu:ret = CreateMenu(title, columns, x, y, col1width, col2width);
  4828. if (_FIXES_IN_RANGE(_:ret, 0, MAX_MENUS))
  4829. {
  4830. #if FIXES_Single
  4831. FIXES_gsValidMenus[_:ret >>> 5] |= 1 << (_:ret & 0x1F);
  4832. #else
  4833. CallRemoteFunction("_FIXES_CreateMenu", FIXES_gscSpec@i, _:ret);
  4834. #endif
  4835. }
  4836. return ret;
  4837. }
  4838. #define _ALS_CreateMenu
  4839. #define CreateMenu FIXES_CreateMenu
  4840. #endif
  4841. /*
  4842. * _FIXES_SetPlayerMenu(playerid, Menu:menuid)
  4843. *
  4844. * FIXES:
  4845. * GetPlayerMenu
  4846. */
  4847. #if FIX_GetPlayerMenu && !FIXES_Single
  4848. forward _FIXES_SetPlayerMenu(playerid, Menu:menuid);
  4849. public _FIXES_SetPlayerMenu(playerid, Menu:menuid)
  4850. {
  4851. FIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET;
  4852. FIXES_gsCurrentMenu[playerid] = menuid;
  4853. }
  4854. #endif
  4855. /*
  4856. * _FIXES_ClearPlayerMenu(playerid)
  4857. *
  4858. * FIXES:
  4859. * GetPlayerMenu
  4860. */
  4861. #if FIX_GetPlayerMenu && !FIXES_Single
  4862. forward _FIXES_ClearPlayerMenu(playerid);
  4863. public _FIXES_ClearPlayerMenu(playerid)
  4864. {
  4865. FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  4866. FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  4867. }
  4868. #endif
  4869. /*
  4870. * Menu:FIXES_DestroyMenu(Menu:menuid)
  4871. *
  4872. * FIXES:
  4873. * GetPlayerMenu
  4874. */
  4875. #if defined _ALS_DestroyMenu
  4876. #error _ALS_DestroyMenu defined
  4877. #endif
  4878. native BAD_DestroyMenu(Menu:menuid) = DestroyMenu;
  4879. #if _FIX_Menus || FIX_GetPlayerMenu
  4880. #if _FIX_Menus && !FIXES_Single
  4881. forward _FIXES_DestroyMenu(ret);
  4882. public _FIXES_DestroyMenu(ret)
  4883. {
  4884. FIXES_gsValidMenus[ret >>> 5] &= ~(1 << (ret & 0x1F));
  4885. }
  4886. #endif
  4887. stock FIXES_DestroyMenu(Menu:menuid)
  4888. {
  4889. #if _FIX_Menus
  4890. if (FIXES_IS_VALID_MENU(menuid))
  4891. #endif
  4892. {
  4893. if (DestroyMenu(Menu:menuid))
  4894. {
  4895. #if _FIX_Menus
  4896. #if FIXES_Single
  4897. FIXES_gsValidMenus[_:menuid >>> 5] &= ~(1 << (_:menuid & 0x1F));
  4898. #else
  4899. CallRemoteFunction("_FIXES_DestroyMenu", FIXES_gscSpec@i, _:menuid);
  4900. #endif
  4901. #endif
  4902. _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
  4903. {
  4904. if (FIXES_gsCurrentMenu[playerid] == menuid)
  4905. {
  4906. if (HideMenuForPlayer(menuid, playerid))
  4907. {
  4908. #if FIXES_Single
  4909. FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  4910. FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  4911. #else
  4912. CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU);
  4913. #endif
  4914. }
  4915. }
  4916. }
  4917. return 1;
  4918. }
  4919. }
  4920. return 0;
  4921. }
  4922. #define _ALS_DestroyMenu
  4923. #define DestroyMenu FIXES_DestroyMenu
  4924. #endif
  4925. /*
  4926. * FIXES_AddMenuItem(Menu:menuid, column, const menutext[])
  4927. *
  4928. * FIXES:
  4929. * AddMenuItem
  4930. */
  4931. #if defined _ALS_AddMenuItem
  4932. #error _ALS_AddMenuItem defined
  4933. #endif
  4934. native BAD_AddMenuItem(Menu:menuid, column, const menutext[]) = AddMenuItem;
  4935. #if FIX_AddMenuItem
  4936. stock FIXES_AddMenuItem(Menu:menuid, column, const menutext[])
  4937. {
  4938. if (FIXES_IS_VALID_MENU(menuid))
  4939. {
  4940. return AddMenuItem(menuid, column, menutext);
  4941. }
  4942. return 0;
  4943. }
  4944. #define _ALS_AddMenuItem
  4945. #define AddMenuItem FIXES_AddMenuItem
  4946. #endif
  4947. /*
  4948. * FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[])
  4949. *
  4950. * FIXES:
  4951. * SetMenuColumnHeader
  4952. */
  4953. #if defined _ALS_SetMenuColumnHeader
  4954. #error _ALS_SetMenuColumnHeader defined
  4955. #endif
  4956. native BAD_SetMenuColumnHeader(Menu:menuid, column, const columnheader[]) = SetMenuColumnHeader;
  4957. #if FIX_SetMenuColumnHeader
  4958. stock FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[])
  4959. {
  4960. if (FIXES_IS_VALID_MENU(menuid))
  4961. {
  4962. return SetMenuColumnHeader(menuid, column, columnheader);
  4963. }
  4964. return 0;
  4965. }
  4966. #define _ALS_SetMenuColumnHeader
  4967. #define SetMenuColumnHeader FIXES_SetMenuColumnHeader
  4968. #endif
  4969. /*
  4970. * FIXES_ShowMenuForPlayer(Menu:menuid, playerid)
  4971. *
  4972. * FIXES:
  4973. * ShowMenuForPlayer
  4974. * GetPlayerMenu
  4975. */
  4976. #if defined _ALS_ShowMenuForPlayer
  4977. #error _ALS_ShowMenuForPlayer defined
  4978. #endif
  4979. native BAD_ShowMenuForPlayer(Menu:menuid, playerid) = ShowMenuForPlayer;
  4980. #if FIX_ShowMenuForPlayer || FIX_GetPlayerMenu
  4981. stock FIXES_ShowMenuForPlayer(Menu:menuid, playerid)
  4982. {
  4983. #if FIX_ShowMenuForPlayer
  4984. if (FIXES_IS_VALID_MENU(menuid))
  4985. #endif
  4986. {
  4987. #if FIX_GetPlayerMenu
  4988. if (ShowMenuForPlayer(menuid, playerid))
  4989. {
  4990. #if FIXES_Single
  4991. FIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET;
  4992. FIXES_gsCurrentMenu[playerid] = menuid;
  4993. #else
  4994. CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, _:menuid);
  4995. #endif
  4996. return 1;
  4997. }
  4998. #else
  4999. return ShowMenuForPlayer(menuid, playerid);
  5000. #endif
  5001. }
  5002. return 0;
  5003. }
  5004. #define _ALS_ShowMenuForPlayer
  5005. #define ShowMenuForPlayer FIXES_ShowMenuForPlayer
  5006. #endif
  5007. /*
  5008. * FIXES_HideMenuForPlayer(Menu:menuid, playerid)
  5009. *
  5010. * FIXES:
  5011. * HideMenuForPlayer
  5012. * HideMenuForPlayer_2
  5013. * GetPlayerMenu
  5014. */
  5015. #if defined _ALS_HideMenuForPlayer
  5016. #error _ALS_HideMenuForPlayer defined
  5017. #endif
  5018. native BAD_HideMenuForPlayer(Menu:menuid, playerid) = HideMenuForPlayer;
  5019. #if FIX_HideMenuForPlayer || FIX_GetPlayerMenu
  5020. stock FIXES_HideMenuForPlayer(Menu:menuid, playerid)
  5021. {
  5022. #if FIX_HideMenuForPlayer
  5023. if (FIXES_IS_VALID_MENU(menuid))
  5024. #endif
  5025. {
  5026. #if FIX_GetPlayerMenu
  5027. #if FIX_HideMenuForPlayer_2
  5028. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS) && FIXES_gsCurrentMenu[playerid] == menuid)
  5029. #else
  5030. if (FIXES_gsCurrentMenu[playerid] == menuid && HideMenuForPlayer(menuid, playerid))
  5031. #endif
  5032. {
  5033. #if FIXES_Single
  5034. FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  5035. FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  5036. #else
  5037. CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU);
  5038. #endif
  5039. #if FIX_HideMenuForPlayer_2
  5040. return HideMenuForPlayer(menuid, playerid);
  5041. #else
  5042. return 1;
  5043. #endif
  5044. }
  5045. #else
  5046. return HideMenuForPlayer(menuid, playerid);
  5047. #endif
  5048. }
  5049. return 0;
  5050. }
  5051. #define _ALS_HideMenuForPlayer
  5052. #define HideMenuForPlayer FIXES_HideMenuForPlayer
  5053. #endif
  5054. /*
  5055. * FIXES_DisableMenu(Menu:menuid)
  5056. *
  5057. * FIXES:
  5058. * DisableMenu
  5059. */
  5060. #if defined _ALS_DisableMenu
  5061. #error _ALS_DisableMenu defined
  5062. #endif
  5063. native BAD_DisableMenu(Menu:menuid) = DisableMenu;
  5064. #if FIX_DisableMenu
  5065. stock FIXES_DisableMenu(Menu:menuid)
  5066. {
  5067. if (FIXES_IS_VALID_MENU(menuid))
  5068. {
  5069. return DisableMenu(menuid);
  5070. }
  5071. return 0;
  5072. }
  5073. #define _ALS_DisableMenu
  5074. #define DisableMenu FIXES_DisableMenu
  5075. #endif
  5076. /*
  5077. * FIXES_DisableMenuRow(Menu:menuid, row)
  5078. *
  5079. * FIXES:
  5080. * DisableMenuRow
  5081. */
  5082. #if defined _ALS_DisableMenuRow
  5083. #error _ALS_DisableMenuRow defined
  5084. #endif
  5085. native BAD_DisableMenuRow(Menu:menuid, row) = DisableMenuRow;
  5086. #if FIX_DisableMenuRow
  5087. stock FIXES_DisableMenuRow(Menu:menuid, row)
  5088. {
  5089. if (FIXES_IS_VALID_MENU(menuid))
  5090. {
  5091. return DisableMenuRow(menuid, row);
  5092. }
  5093. return 0;
  5094. }
  5095. #define _ALS_DisableMenuRow
  5096. #define DisableMenuRow FIXES_DisableMenuRow
  5097. #endif
  5098. /*
  5099. * Menu:FIXES_GetPlayerMenu(playerid)
  5100. *
  5101. * FIXES:
  5102. * GetPlayerMenu
  5103. */
  5104. #if defined _ALS_GetPlayerMenu
  5105. #error _ALS_GetPlayerMenu defined
  5106. #endif
  5107. native BAD_GetPlayerMenu(playerid) = GetPlayerMenu;
  5108. #if FIX_GetPlayerMenu
  5109. stock Menu:FIXES_GetPlayerMenu(playerid)
  5110. {
  5111. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  5112. {
  5113. return FIXES_gsCurrentMenu[playerid];
  5114. }
  5115. return Menu:INVALID_MENU;
  5116. }
  5117. #define _ALS_GetPlayerMenu
  5118. #define GetPlayerMenu FIXES_GetPlayerMenu
  5119. #endif
  5120. /*
  5121. * OnPlayerStateChange(playerid, newstate, oldstate)
  5122. *
  5123. * FIXES:
  5124. * HydraSniper
  5125. * GetPlayerWeapon
  5126. * PutPlayerInVehicle
  5127. * TrainExit
  5128. */
  5129. #if FIX_HydraSniper || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_TrainExit
  5130. public OnPlayerStateChange(playerid, newstate, oldstate)
  5131. {
  5132. #if !FIXES_Single
  5133. if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
  5134. {
  5135. return FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
  5136. }
  5137. #endif
  5138. // =============================
  5139. // BEGIN: OnPlayerEnterVehicle
  5140. // =============================
  5141. #if FIX_OnPlayerEnterVehicle
  5142. if (newstate == PLAYER_STATE_PASSENGER)
  5143. {
  5144. new
  5145. model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400;
  5146. if (_FIXES_IN_RANGE(model, 0, 211 + 1))
  5147. {
  5148. new
  5149. seat = GetPlayerVehicleSeat(playerid);
  5150. if (seat != 128)
  5151. {
  5152. model = (FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2)) & 0xF;
  5153. if (model == 0 || model == 15)
  5154. {
  5155. // Shouldn't be in this vehicle at all.
  5156. FIXES_BlockUpdate(playerid, true);
  5157. }
  5158. else if (!(0 < seat <= model)) // Slower with "_FIXES_NO_RANGE".
  5159. {
  5160. // In an out of range seat.
  5161. FIXES_BlockUpdate(playerid, true);
  5162. }
  5163. }
  5164. }
  5165. else
  5166. {
  5167. FIXES_BlockUpdate(playerid, true);
  5168. }
  5169. }
  5170. else if (newstate == PLAYER_STATE_DRIVER)
  5171. {
  5172. new
  5173. model = GetPlayerVehicleSeat(playerid);
  5174. if (model != 128)
  5175. {
  5176. if (model == 0)
  5177. {
  5178. model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400;
  5179. if (_FIXES_NO_RANGE(model, 0, 211 + 1) || FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2) & 0xF == 15)
  5180. {
  5181. // In an invalid vehicle (one you can't drive).
  5182. FIXES_BlockUpdate(playerid, true);
  5183. }
  5184. }
  5185. else
  5186. {
  5187. // They are a driver, but not in the driver's seat.
  5188. FIXES_BlockUpdate(playerid, true);
  5189. }
  5190. }
  5191. #if FIX_HydraSniper
  5192. else
  5193. {
  5194. model = GetVehicleModel(GetPlayerVehicleID(playerid));
  5195. }
  5196. #endif
  5197. #if !FIX_HydraSniper
  5198. }
  5199. #endif
  5200. #endif
  5201. // =============================
  5202. // END: OnPlayerEnterVehicle
  5203. // =============================
  5204. // ====================
  5205. // BEGIN: HydraSniper
  5206. // ====================
  5207. #if FIX_HydraSniper
  5208. #if !FIX_OnPlayerEnterVehicle
  5209. // Only called if the same check above isn't called.
  5210. if (newstate == PLAYER_STATE_DRIVER)
  5211. {
  5212. new
  5213. model = GetVehicleModel(GetPlayerVehicleID(playerid));
  5214. #endif
  5215. if (GetPlayerWeapon(playerid) == 34 && (model == 520 || model == 425))
  5216. {
  5217. SetPlayerArmedWeapon(playerid, 0);
  5218. #if FIX_GetPlayerWeapon
  5219. // This is the first cross-dependednt fix.
  5220. #if FIXES_Single
  5221. FIXES_gsPlayerWeapon[playerid] = 0;
  5222. #else
  5223. SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
  5224. #endif
  5225. #endif
  5226. }
  5227. }
  5228. #endif
  5229. // ====================
  5230. // END: HydraSniper
  5231. // ====================
  5232. #if FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_TrainExit
  5233. #if PLAYER_STATE_PASSENGER != PLAYER_STATE_DRIVER + 1
  5234. #error FIX_GetPlayerWeapon/FIX_PutPlayerInVehicle state assertation failed.
  5235. #endif
  5236. if (_FIXES_IN_RANGE(oldstate, PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER + 1))
  5237. {
  5238. #if FIX_PutPlayerInVehicle || FIX_TrainExit
  5239. new
  5240. e_FIXES_BOOLS:bools = FIXES_gsPlayerBools[playerid];
  5241. #endif
  5242. // ========================
  5243. // BEGIN: GetPlayerWeapon
  5244. // ========================
  5245. #if FIX_GetPlayerWeapon
  5246. #if FIXES_Single
  5247. FIXES_gsPlayerWeapon[playerid] = -1;
  5248. #else
  5249. SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);
  5250. #endif
  5251. #endif
  5252. // ========================
  5253. // END: GetPlayerWeapon
  5254. // ========================
  5255. // ==================
  5256. // BEGIN: TrainExit
  5257. // ==================
  5258. #if FIX_TrainExit
  5259. FIXES_PRINTF("train exit");
  5260. if (bools & e_FIXES_BOOLS_PUT_IN_TRAIN)
  5261. {
  5262. FIXES_PRINTF("OK");
  5263. SetCameraBehindPlayer(playerid),
  5264. bools &= ~e_FIXES_BOOLS_PUT_IN_TRAIN;
  5265. }
  5266. #endif
  5267. // ==================
  5268. // END: TrainExit
  5269. // ==================
  5270. // ===========================
  5271. // BEGIN: PutPlayerInVehicle
  5272. // ===========================
  5273. #if FIX_PutPlayerInVehicle
  5274. // Update their vehicle once we KNOW the client has done the
  5275. // removal from the vehicle.
  5276. if (bools & e_FIXES_BOOLS_PUT_IN_VEHICLE)
  5277. {
  5278. new
  5279. vid = FIXES_gsVehicleSeatData[playerid] & 0x00FFFFFF;
  5280. // Limited to "only" 16777216 vehicles and 256 seats.
  5281. PutPlayerInVehicle(playerid, vid, FIXES_gsVehicleSeatData[playerid] >>> 24),
  5282. bools &= ~e_FIXES_BOOLS_PUT_IN_VEHICLE;
  5283. #if FIX_TrainExit
  5284. switch (GetVehicleModel(vid))
  5285. {
  5286. case 449, 537, 538:
  5287. {
  5288. bools |= e_FIXES_BOOLS_PUT_IN_TRAIN;
  5289. }
  5290. }
  5291. #endif
  5292. }
  5293. #endif
  5294. // ===========================
  5295. // END: PutPlayerInVehicle
  5296. // ===========================
  5297. #if FIX_PutPlayerInVehicle || FIX_TrainExit
  5298. FIXES_gsPlayerBools[playerid] = bools;
  5299. #endif
  5300. }
  5301. #endif
  5302. return FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
  5303. }
  5304. #if defined _ALS_OnPlayerStateChange
  5305. #error _ALS_OnPlayerStateChange defined
  5306. #endif
  5307. #define _ALS_OnPlayerStateChange
  5308. #define OnPlayerStateChange(%0) FIXES_OnPlayerStateChange(%0) <_ALS : _ALS_go>
  5309. _FIXES_FORWARD FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
  5310. #endif
  5311. /*
  5312. * FIXES_GivePlayerWeapon(playerid, weaponid, ammo)
  5313. *
  5314. * FIXES:
  5315. * HydraSniper
  5316. */
  5317. #if defined _ALS_GivePlayerWeapon
  5318. #error _ALS_GivePlayerWeapon defined
  5319. #endif
  5320. native BAD_GivePlayerWeapon(playerid, weaponid, ammo) = GivePlayerWeapon;
  5321. #if FIX_HydraSniper
  5322. stock FIXES_GivePlayerWeapon(playerid, weaponid, ammo)
  5323. {
  5324. new
  5325. vid = GetPlayerVehicleID(playerid);
  5326. if (vid)
  5327. {
  5328. vid = GetVehicleModel(vid);
  5329. if (weaponid == 34 && (vid == 520 || vid == 425))
  5330. {
  5331. vid = GivePlayerWeapon(playerid, weaponid, ammo),
  5332. SetPlayerArmedWeapon(playerid, 0);
  5333. #if FIX_GetPlayerWeapon
  5334. #if FIXES_Single
  5335. FIXES_gsPlayerWeapon[playerid] = 0;
  5336. #else
  5337. SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
  5338. #endif
  5339. #endif
  5340. return vid;
  5341. }
  5342. }
  5343. return GivePlayerWeapon(playerid, weaponid, ammo);
  5344. }
  5345. #define _ALS_GivePlayerWeapon
  5346. #define GivePlayerWeapon FIXES_GivePlayerWeapon
  5347. #endif
  5348. /*
  5349. * FIXES_SetPlayerArmedWeapon(playerid, weaponid)
  5350. *
  5351. * FIXES:
  5352. * GetPlayerWeapon
  5353. */
  5354. #if defined _ALS_SetPlayerArmedWeapon
  5355. #error _ALS_SetPlayerArmedWeapon defined
  5356. #endif
  5357. native BAD_SetPlayerArmedWeapon(playerid, weaponid) = SetPlayerArmedWeapon;
  5358. #if FIX_GetPlayerWeapon
  5359. stock FIXES_SetPlayerArmedWeapon(playerid, weaponid)
  5360. {
  5361. #if FIX_AllowInteriorWeapons
  5362. if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR && GetPlayerInterior(playerid))
  5363. {
  5364. // Not allowed weapons.
  5365. return 0;
  5366. }
  5367. #endif
  5368. new
  5369. vid = GetPlayerVehicleID(playerid);
  5370. if (vid)
  5371. {
  5372. #if FIX_HydraSniper
  5373. vid = GetVehicleModel(vid);
  5374. if (weaponid == 34 && (vid == 520 || vid == 425))
  5375. {
  5376. return 0;
  5377. }
  5378. #endif
  5379. //FIXES_gsPlayerWeapon[playerid] = weaponid;
  5380. #if FIXES_Single
  5381. FIXES_gsPlayerWeapon[playerid] = weaponid;
  5382. #else
  5383. SetPVarInt(playerid, FIXES_pvarPlayerWeapon, weaponid);
  5384. #endif
  5385. }
  5386. return SetPlayerArmedWeapon(playerid, weaponid);
  5387. }
  5388. #define _ALS_SetPlayerArmedWeapon
  5389. #define SetPlayerArmedWeapon FIXES_SetPlayerArmedWeapon
  5390. #endif
  5391. /*
  5392. * FIXES_GetPlayerWeapon(playerid)
  5393. *
  5394. * FIXES:
  5395. * GetPlayerWeapon
  5396. */
  5397. #if defined _ALS_GetPlayerWeapon
  5398. #error _ALS_GetPlayerWeapon defined
  5399. #endif
  5400. native BAD_GetPlayerWeapon(playerid) = GetPlayerWeapon;
  5401. #if FIX_GetPlayerWeapon
  5402. stock FIXES_GetPlayerWeapon(playerid)
  5403. {
  5404. #if FIXES_Single
  5405. new
  5406. ret = FIXES_gsPlayerWeapon[playerid];
  5407. #else
  5408. new
  5409. ret = GetPVarInt(playerid, FIXES_pvarPlayerWeapon);
  5410. #endif
  5411. if (ret == -1)
  5412. {
  5413. return GetPlayerWeapon(playerid);
  5414. }
  5415. return ret;
  5416. }
  5417. #define _ALS_GetPlayerWeapon
  5418. #define GetPlayerWeapon FIXES_GetPlayerWeapon
  5419. #endif
  5420. /*
  5421. * FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
  5422. *
  5423. * FIXES:
  5424. * PutPlayerInVehicle
  5425. */
  5426. #if defined _ALS_PutPlayerInVehicle
  5427. #error _ALS_PutPlayerInVehicle defined
  5428. #endif
  5429. native BAD_PutPlayerInVehicle(playerid, vehicleid, seatid) = PutPlayerInVehicle;
  5430. #if FIX_PutPlayerInVehicle || FIX_TrainExit
  5431. #if FIXES_Single
  5432. stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
  5433. {
  5434. // ==================
  5435. // BEGIN: TrainExit
  5436. // ==================
  5437. #if FIX_TrainExit
  5438. FIXES_PRINTF("TrainExit %d", GetVehicleModel(vehicleid));
  5439. switch (GetVehicleModel(vehicleid))
  5440. {
  5441. case 449, 537, 538:
  5442. {
  5443. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
  5444. }
  5445. }
  5446. #endif
  5447. // ==================
  5448. // END: TrainExit
  5449. // ==================
  5450. // ===========================
  5451. // BEGIN: PutPlayerInVehicle
  5452. // ===========================
  5453. #if FIX_PutPlayerInVehicle
  5454. new
  5455. vid = GetPlayerVehicleID(playerid);
  5456. if (vid)
  5457. {
  5458. new
  5459. Float:x,
  5460. Float:y,
  5461. Float:z;
  5462. // Remove them without the animation.
  5463. return
  5464. GetVehiclePos(vid, x, y, z),
  5465. SetPlayerPos(playerid, x, y, z),
  5466. FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid,
  5467. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE,
  5468. 1;
  5469. }
  5470. #endif
  5471. // ===========================
  5472. // END: PutPlayerInVehicle
  5473. // ===========================
  5474. return PutPlayerInVehicle(playerid, vehicleid, seatid);
  5475. }
  5476. #else
  5477. forward _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data);
  5478. stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
  5479. {
  5480. FIXES_PRINTF("NOT SINGLE");
  5481. // ===========================
  5482. // BEGIN: PutPlayerInVehicle
  5483. // ===========================
  5484. #if FIX_PutPlayerInVehicle
  5485. new
  5486. vid = GetPlayerVehicleID(playerid);
  5487. if (vid)
  5488. {
  5489. new
  5490. Float:x,
  5491. Float:y,
  5492. Float:z;
  5493. // Remove them without the animation.
  5494. return
  5495. GetVehiclePos(vid, x, y, z),
  5496. SetPlayerPos(playerid, x, y, z),
  5497. CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 1, vid),
  5498. 1;
  5499. }
  5500. #endif
  5501. // ===========================
  5502. // END: PutPlayerInVehicle
  5503. // ===========================
  5504. // ==================
  5505. // BEGIN: TrainExit
  5506. // ==================
  5507. #if FIX_TrainExit
  5508. new
  5509. model = GetVehicleModel(vehicleid);
  5510. switch (model)
  5511. {
  5512. case 449, 537, 538:
  5513. {
  5514. CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 0, model);
  5515. //FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
  5516. }
  5517. }
  5518. #endif
  5519. // ==================
  5520. // END: TrainExit
  5521. // ==================
  5522. return PutPlayerInVehicle(playerid, vehicleid, seatid);
  5523. }
  5524. public _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data)
  5525. {
  5526. FIXES_PRINTF("IN CHARGE: %d", (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE));
  5527. _FIXES_IS_IN_CHARGE()
  5528. {
  5529. // ===========================
  5530. // BEGIN: PutPlayerInVehicle
  5531. // ===========================
  5532. #if FIX_PutPlayerInVehicle
  5533. if (from)
  5534. {
  5535. FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid,
  5536. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE;
  5537. }
  5538. #endif
  5539. // ===========================
  5540. // END: PutPlayerInVehicle
  5541. // ===========================
  5542. // ==================
  5543. // BEGIN: TrainExit
  5544. // ==================
  5545. #if FIX_TrainExit
  5546. #if FIX_PutPlayerInVehicle
  5547. else
  5548. #else
  5549. if (!from)
  5550. #endif
  5551. {
  5552. switch (data)
  5553. {
  5554. case 449, 537, 538:
  5555. {
  5556. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
  5557. }
  5558. }
  5559. }
  5560. #endif
  5561. // ==================
  5562. // END: TrainExit
  5563. // ==================
  5564. }
  5565. return 1;
  5566. }
  5567. #endif
  5568. #define _ALS_PutPlayerInVehicle
  5569. #define PutPlayerInVehicle FIXES_PutPlayerInVehicle
  5570. #endif
  5571. /*
  5572. * FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
  5573. *
  5574. * FIXES:
  5575. * SetPlayerCheckpoint
  5576. */
  5577. #if defined _ALS_SetPlayerCheckpoint
  5578. #error _ALS_SetPlayerCheckpoint defined
  5579. #endif
  5580. native BAD_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) = SetPlayerCheckpoint;
  5581. #if FIX_SetPlayerCheckpoint
  5582. stock FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
  5583. {
  5584. return
  5585. DisablePlayerCheckpoint(playerid),
  5586. SetPlayerCheckpoint(playerid, x, y, z, size);
  5587. }
  5588. #define _ALS_SetPlayerCheckpoint
  5589. #define SetPlayerCheckpoint FIXES_SetPlayerCheckpoint
  5590. #endif
  5591. /*
  5592. * FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
  5593. *
  5594. * FIXES:
  5595. * SetPlayerRaceCheckpoint
  5596. */
  5597. #if defined _ALS_SetPlayerRaceCheckpoint
  5598. #error _ALS_SetPlayerRaceCheckpoint defined
  5599. #endif
  5600. native BAD_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) = SetPlayerRaceCheckpoint;
  5601. #if FIX_SetPlayerRaceCheckpoint
  5602. stock FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
  5603. {
  5604. return
  5605. DisablePlayerRaceCheckpoint(playerid),
  5606. SetPlayerRaceCheckpoint(playerid, type, x, y, z, nextx, nexty, nextz, size);
  5607. }
  5608. #define _ALS_SetPlayerRaceCheckpoint
  5609. #define SetPlayerRaceCheckpoint FIXES_SetPlayerRaceCheckpoint
  5610. #endif
  5611. /*
  5612. * _FIXES_HideGameTextForPlayer(playerid, style, parr[])
  5613. *
  5614. * Hides a GameText style for one or more players, and accounts for the fact
  5615. * that they may have different messages being shown.
  5616. *
  5617. * FIXES:
  5618. * GameText
  5619. */
  5620. #if FIX_GameText
  5621. static stock _FIXES_HideGameTextForPlayer(playerid, style, parr[])
  5622. {
  5623. switch (playerid)
  5624. {
  5625. case MAX_PLAYERS:
  5626. {
  5627. // Remove the global GameText for everyone that can see it.
  5628. TextDrawHideForAll(FIXES_gsGTStyle[style]);
  5629. }
  5630. case INVALID_PLAYER_ID:
  5631. {
  5632. // Hide any player-local ones. This is similar to "foreach".
  5633. playerid = parr[MAX_PLAYERS],
  5634. parr[MAX_PLAYERS] = MAX_PLAYERS;
  5635. for (new next; playerid != MAX_PLAYERS; playerid = next)
  5636. {
  5637. PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]),
  5638. next = parr[playerid],
  5639. parr[playerid] = 0;
  5640. }
  5641. }
  5642. default:
  5643. {
  5644. // Remove.
  5645. PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]),
  5646. _FIXES_RemoveInternal(parr, playerid, MAX_PLAYERS);
  5647. }
  5648. }
  5649. }
  5650. #endif
  5651. /*
  5652. * _FIXES_HideGameTextTimer(playerid, style)
  5653. *
  5654. * FIXES:
  5655. * GameText
  5656. */
  5657. #if FIX_GameText
  5658. forward _FIXES_HideGameTextTimer(playerid, style);
  5659. public _FIXES_HideGameTextTimer(playerid, style)
  5660. {
  5661. if (GetTickCount() >= FIXES_gsGTTimer[style][playerid])
  5662. {
  5663. // Only hide it if it hasn't been re-shown in the interim.
  5664. _FIXES_HideGameTextForPlayer(playerid, style, FIXES_gsPlayerPGTShown[style]);
  5665. }
  5666. }
  5667. #endif
  5668. /*
  5669. * _FIXES_GameTextShow(playerid, string[], time, style)
  5670. *
  5671. * FIXES:
  5672. * GameText
  5673. */
  5674. #if FIX_GameText
  5675. forward _FIXES_GameTextShow(playerid, string[], time, style);
  5676. public _FIXES_GameTextShow(playerid, string[], time, style)
  5677. {
  5678. _FIXES_IS_IN_CHARGE()
  5679. {
  5680. if (playerid == MAX_PLAYERS)
  5681. {
  5682. _FIXES_HideGameTextForPlayer(INVALID_PLAYER_ID, style, FIXES_gsPlayerPGTShown[style]),
  5683. TextDrawSetString(FIXES_gsGTStyle[style], string),
  5684. TextDrawShowForAll(FIXES_gsGTStyle[style]);
  5685. }
  5686. else
  5687. {
  5688. TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[style]),
  5689. PlayerTextDrawSetString(playerid, FIXES_gsPGTStyle[playerid][style], string),
  5690. PlayerTextDrawShow(playerid, FIXES_gsPGTStyle[playerid][style]),
  5691. _FIXES_AddInternal(FIXES_gsPlayerPGTShown[style], playerid, MAX_PLAYERS);
  5692. }
  5693. if (time)
  5694. {
  5695. // Tiny offset because timers are inaccurate.
  5696. FIXES_gsGTTimer[style][playerid] = GetTickCount() + time - 10,
  5697. // Don't need to save the timer's ID.
  5698. SetTimerEx(FIXES_gscHideGameTextTimer, time, false, FIXES_gscSpec@ii, playerid, style);
  5699. }
  5700. }
  5701. return 1;
  5702. }
  5703. #endif
  5704. /*
  5705. * FIXES_GameTextForAll(string[], time, style)
  5706. *
  5707. * FIXES:
  5708. * GameText
  5709. */
  5710. #if defined _ALS_GameTextForAll
  5711. #error _ALS_GameTextForAll defined
  5712. #endif
  5713. native BAD_GameTextForAll(const string[], time, style) = GameTextForAll;
  5714. #if FIX_GameText
  5715. stock FIXES_GameTextForAll(string[], time, style)
  5716. {
  5717. if (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT))
  5718. {
  5719. if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
  5720. {
  5721. #if FIXES_Single
  5722. return _FIXES_GameTextShow(MAX_PLAYERS, FIXES_gscSpace, time, style);
  5723. #else
  5724. return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, FIXES_gscSpace, time, style);
  5725. #endif
  5726. }
  5727. else
  5728. {
  5729. #if FIXES_Single
  5730. return _FIXES_GameTextShow(MAX_PLAYERS, string, time, style);
  5731. #else
  5732. return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, string, time, style);
  5733. #endif
  5734. }
  5735. }
  5736. return 0;
  5737. }
  5738. #define _ALS_GameTextForAll
  5739. #define GameTextForAll FIXES_GameTextForAll
  5740. #endif
  5741. /*
  5742. * FIXES_GameTextForPlayer(playerid, string[], time, style)
  5743. *
  5744. * FIXES:
  5745. * GameText
  5746. */
  5747. #if defined _ALS_GameTextForPlayer
  5748. #error _ALS_GameTextForPlayer defined
  5749. #endif
  5750. native BAD_GameTextForPlayer(playerid, const string[], time, style) = GameTextForPlayer;
  5751. #if FIX_GameText
  5752. stock FIXES_GameTextForPlayer(playerid, string[], time, style)
  5753. {
  5754. if (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT) && _FIXES_IS_PLAYER_CONNECTED(playerid))
  5755. {
  5756. if ((string[0] <= '\0') || (string[0] == '\1' && string[1] == '\0'))
  5757. {
  5758. #if FIXES_Single
  5759. return _FIXES_GameTextShow(playerid, FIXES_gscSpace, time, style);
  5760. #else
  5761. return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, FIXES_gscSpace, time, style);
  5762. #endif
  5763. }
  5764. else
  5765. {
  5766. #if FIXES_Single
  5767. return _FIXES_GameTextShow(playerid, string, time, style);
  5768. #else
  5769. return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, string, time, style);
  5770. #endif
  5771. }
  5772. }
  5773. return 0;
  5774. }
  5775. #define _ALS_GameTextForPlayer
  5776. #define GameTextForPlayer FIXES_GameTextForPlayer
  5777. #endif
  5778. /*
  5779. * HideGameTextForAll(style)
  5780. *
  5781. * FIXES:
  5782. * HideGameText
  5783. */
  5784. #if defined _ALS_HideGameTextForAll
  5785. #error _ALS_HideGameTextForAll defined
  5786. #endif
  5787. native BAD_HideGameTextForAll(style) = HideGameTextForAll;
  5788. #if FIX_HideGameText
  5789. #define _ALS_HideGameTextForAll
  5790. #define HideGameTextForAll(%0) GameTextForAll(FIXES_gscSpace, 0, (%0))
  5791. #endif
  5792. /*
  5793. * HideGameTextForPlayer(playerid, style)
  5794. *
  5795. * FIXES:
  5796. * HideGameText
  5797. */
  5798. #if defined _ALS_HideGameTextForPlayer
  5799. #error _ALS_HideGameTextForPlayer defined
  5800. #endif
  5801. native BAD_HideGameTextForPlayer(playerid, style) = HideGameTextForPlayer;
  5802. #if FIX_HideGameText
  5803. #define _ALS_HideGameTextForPlayer
  5804. #define HideGameTextForPlayer(%1,%0) GameTextForPlayer((%1), FIXES_gscSpace, 0, (%0))
  5805. #endif
  5806. /*
  5807. * PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])
  5808. *
  5809. * FIXES:
  5810. * CreatePlayerTextDraw
  5811. */
  5812. #if defined _ALS_CreatePlayerTextDraw
  5813. #error _ALS_CreatePlayerTextDraw defined
  5814. #endif
  5815. native Text:BAD_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[]) = CreatePlayerTextDraw;
  5816. #if FIX_CreatePlayerTextDraw
  5817. stock PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])
  5818. {
  5819. if ((text[0] == '\0') || (text[0] == '\1' && text[1] == '\0'))
  5820. {
  5821. return CreatePlayerTextDraw(playerid, x, y, FIXES_gscSpace);
  5822. }
  5823. else
  5824. {
  5825. return CreatePlayerTextDraw(playerid, x, y, text);
  5826. }
  5827. }
  5828. #define _ALS_CreatePlayerTextDraw
  5829. #define CreatePlayerTextDraw FIXES_CreatePlayerTextDraw
  5830. #endif
  5831. /*
  5832. * FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[])
  5833. *
  5834. * FIXES:
  5835. * PlayerTextDrawSetString
  5836. */
  5837. #if defined _ALS_PlayerTextDrawSetString
  5838. #error _ALS_PlayerTextDrawSetString defined
  5839. #endif
  5840. native BAD_PlayerTextDrawSetString(playerid, PlayerText:text, string[]) = PlayerTextDrawSetString;
  5841. #if FIX_PlayerTextDrawSetString
  5842. stock FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[])
  5843. {
  5844. if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
  5845. {
  5846. return PlayerTextDrawSetString(playerid, text, FIXES_gscSpace);
  5847. }
  5848. else
  5849. {
  5850. return PlayerTextDrawSetString(playerid, text, string);
  5851. }
  5852. }
  5853. #define _ALS_PlayerTextDrawSetString
  5854. #define PlayerTextDrawSetString FIXES_PlayerTextDrawSetString
  5855. #endif
  5856. /*
  5857. * Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
  5858. *
  5859. * FIXES:
  5860. * TextDrawCreate
  5861. */
  5862. #if defined _ALS_TextDrawCreate
  5863. #error _ALS_TextDrawCreate defined
  5864. native Text:BAD_TextDrawCreate(Float:x, Float:y, text[]) = TextDrawCreate;
  5865. #if FIX_TextDrawCreate
  5866. stock Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
  5867. {
  5868. if ((text[0] == '\0') || (text[0] == '\1' && text[1] == '\0'))
  5869. {
  5870. return TextDrawCreate(x, y, FIXES_gscSpace);
  5871. }
  5872. else
  5873. {
  5874. return TextDrawCreate(x, y, text);
  5875. }
  5876. }
  5877. #endif
  5878. #define _ALS_TextDrawCreate
  5879. #define TextDrawCreate FIXES_TextDrawCreate
  5880. #endif
  5881. /*
  5882. * FIXES_TextDrawSetString(Text:text, string[])
  5883. *
  5884. * FIXES:
  5885. * TextDrawSetString
  5886. */
  5887. #if defined _ALS_TextDrawSetString
  5888. #error _ALS_TextDrawSetString defined
  5889. #endif
  5890. native BAD_TextDrawSetString(Text:text, string[]) = TextDrawSetString;
  5891. #if FIX_TextDrawSetString
  5892. stock FIXES_TextDrawSetString(Text:text, string[])
  5893. {
  5894. if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
  5895. {
  5896. return TextDrawSetString(text, FIXES_gscSpace);
  5897. }
  5898. else
  5899. {
  5900. return TextDrawSetString(text, string);
  5901. }
  5902. }
  5903. #define _ALS_TextDrawSetString
  5904. #define TextDrawSetString FIXES_TextDrawSetString
  5905. #endif
  5906. /*
  5907. * FIXES_AllowInteriorWeapons(allow)
  5908. *
  5909. * FIXES:
  5910. * AllowInteriorWeapons
  5911. */
  5912. #if defined _ALS_AllowInteriorWeapons
  5913. #error _ALS_AllowInteriorWeapons defined
  5914. #endif
  5915. native BAD_AllowInteriorWeapons(allow) = AllowInteriorWeapons;
  5916. #if FIX_AllowInteriorWeapons
  5917. #if FIXES_Single
  5918. stock FIXES_AllowInteriorWeapons(allow)
  5919. {
  5920. if (allow)
  5921. {
  5922. FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
  5923. _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
  5924. {
  5925. FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR;
  5926. }
  5927. }
  5928. else
  5929. {
  5930. FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;
  5931. _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
  5932. {
  5933. if (GetPlayerInterior(i))
  5934. {
  5935. FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR;
  5936. }
  5937. }
  5938. }
  5939. return allow;
  5940. }
  5941. #else
  5942. forward _FIXES_AllowInteriorWeapons(allow);
  5943. stock FIXES_AllowInteriorWeapons(allow)
  5944. {
  5945. CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, allow);
  5946. return allow;
  5947. }
  5948. public _FIXES_AllowInteriorWeapons(allow)
  5949. {
  5950. if (allow)
  5951. {
  5952. FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
  5953. _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
  5954. {
  5955. FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR;
  5956. }
  5957. }
  5958. else
  5959. {
  5960. FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;
  5961. _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
  5962. {
  5963. if (GetPlayerInterior(i))
  5964. {
  5965. FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR;
  5966. }
  5967. }
  5968. }
  5969. return allow;
  5970. }
  5971. #endif
  5972. #define _ALS_AllowInteriorWeapons
  5973. #define AllowInteriorWeapons FIXES_AllowInteriorWeapons
  5974. #endif
  5975. /*
  5976. * FIXES_GetPlayerInterior(playerid)
  5977. *
  5978. * FIXES:
  5979. * GetPlayerInterior
  5980. */
  5981. #if defined _ALS_GetPlayerInterior
  5982. #error _ALS_GetPlayerInterior defined
  5983. #endif
  5984. native BAD_GetPlayerInterior(playerid) = GetPlayerInterior;
  5985. #if FIX_GetPlayerInterior
  5986. stock FIXES_GetPlayerInterior(playerid)
  5987. {
  5988. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  5989. {
  5990. #if FIXES_Single
  5991. return FIXES_gsInterior[playerid];
  5992. #else
  5993. return GetPVarInt(playerid, FIXES_pvarPlayerInterior);
  5994. #endif
  5995. }
  5996. return 0;
  5997. }
  5998. #define _ALS_GetPlayerInterior
  5999. #define GetPlayerInterior FIXES_GetPlayerInterior
  6000. #endif
  6001. /*
  6002. * FIXES_SetPlayerInterior(playerid, interiorid)
  6003. *
  6004. * FIXES:
  6005. * GetPlayerInterior
  6006. */
  6007. #if defined _ALS_SetPlayerInterior
  6008. #error _ALS_SetPlayerInterior defined
  6009. #endif
  6010. native BAD_SetPlayerInterior(playerid, interiorid) = SetPlayerInterior;
  6011. #if FIX_GetPlayerInterior
  6012. stock FIXES_SetPlayerInterior(playerid, interiorid)
  6013. {
  6014. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6015. {
  6016. #if FIXES_Single
  6017. FIXES_gsInterior[playerid] = interiorid;
  6018. #else
  6019. SetPVarInt(playerid, FIXES_pvarPlayerInterior, interiorid);
  6020. #endif
  6021. return SetPlayerInterior(playerid, interiorid);
  6022. }
  6023. return 0;
  6024. }
  6025. #define _ALS_SetPlayerInterior
  6026. #define SetPlayerInterior FIXES_SetPlayerInterior
  6027. #endif
  6028. /*
  6029. * OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
  6030. *
  6031. * FIXES:
  6032. * AllowTeleport
  6033. */
  6034. #if FIX_AllowTeleport && !defined FILTERSCRIPT
  6035. forward _FIXES_AllowTeleport(playerid, allow);
  6036. public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
  6037. {
  6038. // ======================
  6039. // BEGIN: AllowTeleport
  6040. // ======================
  6041. #if FIX_AllowTeleport
  6042. if (!_FIXES_gIsFilterscript)
  6043. {
  6044. // Unusually, the call order here is always Game Mode first -
  6045. // most callbacks are Filter Script first.
  6046. if ((FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_TELEPORT) || ((FIXES_gsSettings & e_FIXES_SETTINGS_ADMIN_TELEPORT) && (IsPlayerAdmin(playerid))))
  6047. {
  6048. SetPlayerPosFindZ(playerid, fX, fY, fZ);
  6049. }
  6050. }
  6051. #endif
  6052. // ======================
  6053. // END: AllowTeleport
  6054. // ======================
  6055. return FIXES_OnPlayerClickMap(playerid, fX, fY, fZ);
  6056. }
  6057. #if defined _ALS_OnPlayerClickMap
  6058. #error _ALS_OnPlayerClickMap defined
  6059. #endif
  6060. #define _ALS_OnPlayerClickMap
  6061. #define OnPlayerClickMap(%0) FIXES_OnPlayerClickMap(%0) <_ALS : _ALS_go>
  6062. _FIXES_FORWARD FIXES_OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ);
  6063. #endif
  6064. /*
  6065. * FIXES_AllowPlayerTeleport(playerid, allow)
  6066. *
  6067. * FIXES:
  6068. * AllowTeleport
  6069. */
  6070. #if defined _ALS_AllowPlayerTeleport
  6071. #error _ALS_AllowPlayerTeleport defined
  6072. #endif
  6073. native BAD_AllowPlayerTeleport(playerid, allow) = AllowPlayerTeleport;
  6074. #if FIX_AllowTeleport
  6075. #if FIXES_Single
  6076. stock FIXES_AllowPlayerTeleport(playerid, allow)
  6077. {
  6078. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6079. {
  6080. if (allow)
  6081. {
  6082. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;
  6083. }
  6084. else
  6085. {
  6086. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;
  6087. }
  6088. }
  6089. return 0;
  6090. }
  6091. #else
  6092. stock FIXES_AllowPlayerTeleport(playerid, allow)
  6093. {
  6094. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6095. {
  6096. CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, playerid, allow);
  6097. }
  6098. return 0;
  6099. }
  6100. #endif
  6101. #define _ALS_AllowPlayerTeleport
  6102. #define AllowPlayerTeleport FIXES_AllowPlayerTeleport
  6103. #endif
  6104. /*
  6105. * FIXES_AllowAdminTeleport(allow)
  6106. *
  6107. * FIXES:
  6108. * AllowTeleport
  6109. */
  6110. #if defined _ALS_AllowAdminTeleport
  6111. #error _ALS_AllowAdminTeleport defined
  6112. #endif
  6113. native BAD_AllowAdminTeleport(allow) = AllowAdminTeleport;
  6114. #if FIX_AllowTeleport
  6115. #if FIXES_Single
  6116. stock FIXES_AllowAdminTeleport(allow)
  6117. {
  6118. if (allow)
  6119. {
  6120. FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;
  6121. }
  6122. else
  6123. {
  6124. FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
  6125. }
  6126. return allow;
  6127. }
  6128. #else
  6129. stock FIXES_AllowAdminTeleport(allow)
  6130. {
  6131. return
  6132. CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, INVALID_PLAYER_ID, allow),
  6133. allow;
  6134. }
  6135. #endif
  6136. #define _ALS_AllowAdminTeleport
  6137. #define AllowAdminTeleport FIXES_AllowAdminTeleport
  6138. #endif
  6139. /*
  6140. * FIXES_AllowAdminTeleport(allow)
  6141. *
  6142. * FIXES:
  6143. * AllowTeleport
  6144. */
  6145. #if FIX_AllowTeleport && !defined FILTERSCRIPT && !FIXES_Single
  6146. public _FIXES_AllowTeleport(playerid, allow)
  6147. {
  6148. if (!_FIXES_gIsFilterscript)
  6149. {
  6150. if (playerid == INVALID_PLAYER_ID)
  6151. {
  6152. if (allow)
  6153. {
  6154. FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;
  6155. }
  6156. else
  6157. {
  6158. FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
  6159. }
  6160. }
  6161. else
  6162. {
  6163. if (allow)
  6164. {
  6165. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;
  6166. }
  6167. else
  6168. {
  6169. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;
  6170. }
  6171. }
  6172. }
  6173. }
  6174. #endif
  6175. /*
  6176. * FIXES_SetPlayerSpecialAction(playerid, actionid)
  6177. *
  6178. * FIXES:
  6179. * SetPlayerSpecialAction
  6180. */
  6181. #if defined _ALS_SetPlayerSpecialAction
  6182. #error _ALS_SetPlayerSpecialAction defined
  6183. #endif
  6184. native BAD_SetPlayerSpecialAction(playerid, actionid) = SetPlayerSpecialAction;
  6185. #if FIX_SetPlayerSpecialAction
  6186. stock FIXES_SetPlayerSpecialAction(playerid, actionid)
  6187. {
  6188. if (GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)
  6189. {
  6190. ClearAnimations(playerid);
  6191. }
  6192. SetPlayerSpecialAction(playerid, actionid);
  6193. return 1;
  6194. }
  6195. #define _ALS_SetPlayerSpecialAction
  6196. #define SetPlayerSpecialAction FIXES_SetPlayerSpecialAction
  6197. #endif
  6198. /*
  6199. * FIXES_ClearAnimations(playerid, forcesync = 0)
  6200. *
  6201. * FIXES:
  6202. * ClearAnimations
  6203. */
  6204. #if defined _ALS_ClearAnimations
  6205. #error _ALS_ClearAnimations defined
  6206. #endif
  6207. native BAD_ClearAnimations(playerid, forcesync = 0) = ClearAnimations;
  6208. #if FIX_ClearAnimations || FIX_ClearAnimations_2
  6209. stock FIXES_ClearAnimations(playerid, forcesync = 0)
  6210. {
  6211. #if FIX_ClearAnimations || FIX_ClearAnimations_2
  6212. if (IsPlayerInAnyVehicle(playerid))
  6213. #endif
  6214. #if FIX_ClearAnimations
  6215. {
  6216. return ApplyAnimation(playerid, "PED", "CAR_SIT", 4.0, 0, 0, 0, 0, 1, forcesync);
  6217. }
  6218. #endif
  6219. #if FIX_ClearAnimations + FIX_ClearAnimations_2 == 1 // XOR
  6220. {
  6221. return ClearAnimations(playerid, forcesync);
  6222. }
  6223. #endif
  6224. #if FIX_ClearAnimations_2
  6225. new
  6226. ret = ClearAnimations(playerid, forcesync);
  6227. ApplyAnimation(playerid, "PED", "IDLE_STANCE", 4.0, 0, 0, 0, 0, 1, forcesync);
  6228. ApplyAnimation(playerid, "PED", "IDLE_CHAT", 4.0, 0, 0, 0, 0, 1, forcesync);
  6229. ApplyAnimation(playerid, "PED", "WALK_PLAYER", 4.0, 0, 0, 0, 0, 1, forcesync);
  6230. return ret;
  6231. #endif
  6232. }
  6233. #define _ALS_ClearAnimations
  6234. #define ClearAnimations FIXES_ClearAnimations
  6235. #endif
  6236. /*
  6237. * FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy)
  6238. *
  6239. * FIXES:
  6240. * GangZoneCreate
  6241. */
  6242. #if defined _ALS_GangZoneCreate
  6243. #error _ALS_GangZoneCreate defined
  6244. #endif
  6245. native BAD_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy) = GangZoneCreate;
  6246. #if FIX_GangZoneCreate
  6247. stock FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy)
  6248. {
  6249. return GangZoneCreate(floatsub(minx, floatfract(minx)), floatsub(miny, floatfract(miny)), floatsub(maxx, floatfract(maxx)), floatsub(maxy, floatfract(maxy)));
  6250. }
  6251. #define _ALS_GangZoneCreate
  6252. #define GangZoneCreate FIXES_GangZoneCreate
  6253. #endif
  6254. /*
  6255. * FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])
  6256. *
  6257. * FIXES:
  6258. * OnDialogResponse
  6259. * GetPlayerDialog
  6260. */
  6261. #if defined _ALS_ShowPlayerDialog
  6262. #error _ALS_ShowPlayerDialog defined
  6263. #endif
  6264. native BAD_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) = ShowPlayerDialog;
  6265. #if FIX_OnDialogResponse || FIX_GetPlayerDialog
  6266. stock FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])
  6267. {
  6268. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6269. {
  6270. #if FIXES_Single
  6271. FIXES_gsDialogID[playerid] = dialog;
  6272. #else
  6273. SetPVarInt(playerid, FIXES_pvarPlayerDialog, dialog);
  6274. #endif
  6275. return ShowPlayerDialog(playerid, dialog, style, title, caption, button1, button2);
  6276. }
  6277. return 0;
  6278. }
  6279. #define _ALS_ShowPlayerDialog
  6280. #define ShowPlayerDialog FIXES_ShowPlayerDialog
  6281. #endif
  6282. /*
  6283. * OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  6284. *
  6285. * FIXES:
  6286. * OnDialogResponse
  6287. * GetPlayerDialog
  6288. */
  6289. #if FIX_OnDialogResponse || FIX_GetPlayerDialog
  6290. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  6291. {
  6292. // =========================
  6293. // BEGIN: OnDialogResponse
  6294. // =========================
  6295. #if FIX_OnDialogResponse || FIX_GetPlayerDialog
  6296. #if FIXES_Single
  6297. #if FIX_OnDialogResponse
  6298. dialogid = FIXES_gsDialogID[playerid];
  6299. #endif
  6300. FIXES_gsDialogID[playerid] = INVALID_DIALOG_ID;
  6301. #elseif FIX_OnDialogResponse
  6302. _FIXES_IS_IN_CHARGE()
  6303. {
  6304. // If there are multiple scripts, we can't just wipe the
  6305. // current dialog data or subsequent scripts will display
  6306. // the wrong value.
  6307. dialogid = GetPVarInt(playerid, FIXES_pvarPlayerDialog),
  6308. SetPVarInt(playerid, FIXES_pvarCurrentDialog, dialogid),
  6309. SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
  6310. }
  6311. else
  6312. {
  6313. dialogid = GetPVarInt(playerid, FIXES_pvarCurrentDialog);
  6314. }
  6315. #else
  6316. SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
  6317. #endif
  6318. if (inputtext[0])
  6319. {
  6320. return FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext);
  6321. }
  6322. else
  6323. {
  6324. return FIXES_OnDialogResponse(playerid, dialogid, response, listitem, FIXES_gscNULL);
  6325. }
  6326. #endif
  6327. // =========================
  6328. // END: OnDialogResponse
  6329. // =========================
  6330. }
  6331. #if defined _ALS_OnDialogResponse
  6332. #error _ALS_OnDialogResponse defined
  6333. #endif
  6334. #define _ALS_OnDialogResponse
  6335. #define OnDialogResponse(%0) FIXES_OnDialogResponse(%0) <_ALS : _ALS_go>
  6336. _FIXES_FORWARD FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
  6337. #endif
  6338. /*
  6339. * FIXES_GetPlayerDialog(playerid)
  6340. *
  6341. * FIXES:
  6342. * GetPlayerDialog
  6343. */
  6344. #if defined _ALS_GetPlayerDialog
  6345. #error _ALS_GetPlayerDialog defined
  6346. #endif
  6347. native BAD_GetPlayerDialog(playerid) = GetPlayerDialog;
  6348. #if FIX_GetPlayerDialog
  6349. stock FIXES_GetPlayerDialog(playerid)
  6350. {
  6351. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6352. {
  6353. #if FIXES_Single
  6354. return FIXES_gsDialogID[playerid];
  6355. #else
  6356. return GetPVarInt(playerid, FIXES_pvarPlayerDialog);
  6357. #endif
  6358. }
  6359. return -1;
  6360. }
  6361. #define _ALS_GetPlayerDialog
  6362. #define GetPlayerDialog FIXES_GetPlayerDialog
  6363. #endif
  6364. /*
  6365. * FIXES_valstr(dest[], value, bool:pack = false)
  6366. *
  6367. * FIXES:
  6368. * valstr
  6369. */
  6370. #if defined _ALS_valstr
  6371. #error _ALS_valstr defined
  6372. #endif
  6373. native BAD_valstr(dest[], value, bool:pack = false) = valstr;
  6374. #if FIX_valstr
  6375. stock FIXES_valstr(dest[], value, bool:pack = false)
  6376. {
  6377. // "format" can't handle cellmin properly.
  6378. static const
  6379. sc_szCellmin[] = !"-2147483648";
  6380. if (value == cellmin)
  6381. {
  6382. pack && strpack(dest, sc_szCellmin, 12) || strunpack(dest, sc_szCellmin, 12);
  6383. }
  6384. else
  6385. {
  6386. format(dest, 12, "%d", value),
  6387. pack && strpack(dest, dest, 12);
  6388. }
  6389. return 0;
  6390. }
  6391. #define _ALS_valstr
  6392. #define valstr FIXES_valstr
  6393. #endif
  6394. /*
  6395. * FIXES_fclose(File:handle)
  6396. *
  6397. * FIXES:
  6398. * fclose
  6399. */
  6400. #if defined _ALS_fclose
  6401. #error _ALS_fclose defined
  6402. #endif
  6403. native BAD_fclose(File:handle) = fclose;
  6404. #if FIX_fclose
  6405. stock bool:FIXES_fclose(File:handle)
  6406. {
  6407. return handle && fclose(handle);
  6408. }
  6409. #define _ALS_fclose
  6410. #define fclose FIXES_fclose
  6411. #endif
  6412. /*
  6413. * FIXES_fwrite(File:handle, const string[])
  6414. *
  6415. * FIXES:
  6416. * fwrite
  6417. */
  6418. #if defined _ALS_fwrite
  6419. #error _ALS_fwrite defined
  6420. #endif
  6421. native BAD_fwrite(File:handle, const string[]) = fwrite;
  6422. #if FIX_fwrite
  6423. stock FIXES_fwrite(File:handle, const string[])
  6424. {
  6425. return handle && fwrite(handle, string);
  6426. }
  6427. #define _ALS_fwrite
  6428. #define fwrite FIXES_fwrite
  6429. #endif
  6430. /*
  6431. * FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
  6432. *
  6433. * FIXES:
  6434. * fread
  6435. */
  6436. #if defined _ALS_fread
  6437. #error _ALS_fread defined
  6438. #endif
  6439. native BAD_fread(File:handle, string[], size = sizeof (string), bool:pack = false) = fread;
  6440. #if FIX_fread
  6441. stock FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
  6442. {
  6443. return handle && fread(handle, string, size, pack);
  6444. }
  6445. #define _ALS_fread
  6446. #define fread FIXES_fread
  6447. #endif
  6448. /*
  6449. * FIXES_fputchar(File:handle, value, bool:utf8 = true)
  6450. *
  6451. * FIXES:
  6452. * fputchar
  6453. */
  6454. #if defined _ALS_fputchar
  6455. #error _ALS_fputchar defined
  6456. #endif
  6457. native BAD_fputchar(File:handle, value, bool:utf8 = true) = fputchar;
  6458. #if FIX_fputchar
  6459. stock bool:FIXES_fputchar(File:handle, value, bool:utf8 = true)
  6460. {
  6461. return handle && fputchar(handle, value, utf8);
  6462. }
  6463. #define _ALS_fputchar
  6464. #define fputchar FIXES_fputchar
  6465. #endif
  6466. /*
  6467. * FIXES_fgetchar(File:handle, value, bool:utf8 = true)
  6468. *
  6469. * FIXES:
  6470. * fgetchar
  6471. */
  6472. #if defined _ALS_fgetchar
  6473. #error _ALS_fgetchar defined
  6474. #endif
  6475. native BAD_fgetchar(File:handle, value, bool:utf8 = true) = fgetchar;
  6476. #if FIX_fgetchar
  6477. stock FIXES_fgetchar(File:handle, value, bool:utf8 = true)
  6478. {
  6479. return handle && fgetchar(handle, value, utf8);
  6480. }
  6481. #define _ALS_fgetchar
  6482. #define fgetchar FIXES_fgetchar
  6483. #endif
  6484. /*
  6485. * FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
  6486. *
  6487. * FIXES:
  6488. * fblockwrite
  6489. */
  6490. #if defined _ALS_fblockwrite
  6491. #error _ALS_fblockwrite defined
  6492. #endif
  6493. native BAD_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) = fblockwrite;
  6494. #if FIX_fblockwrite
  6495. stock FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
  6496. {
  6497. return handle && fblockwrite(handle, buffer, size);
  6498. }
  6499. #define _ALS_fblockwrite
  6500. #define fblockwrite FIXES_fblockwrite
  6501. #endif
  6502. /*
  6503. * FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
  6504. *
  6505. * FIXES:
  6506. * fblockread
  6507. */
  6508. #if defined _ALS_fblockread
  6509. #error _ALS_fblockread defined
  6510. #endif
  6511. native BAD_fblockread(File:handle, buffer[], size = sizeof (buffer)) = fblockread;
  6512. #if FIX_fblockread
  6513. stock FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
  6514. {
  6515. return handle && fblockread(handle, buffer, size);
  6516. }
  6517. #define _ALS_fblockread
  6518. #define fblockread FIXES_fblockread
  6519. #endif
  6520. /*
  6521. * FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
  6522. *
  6523. * FIXES:
  6524. * fseek
  6525. */
  6526. #if defined _ALS_fseek
  6527. #error _ALS_fseek defined
  6528. #endif
  6529. native BAD_fseek(File:handle, position = 0, seek_whence:whence = seek_start) = fseek;
  6530. #if FIX_fseek
  6531. stock FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
  6532. {
  6533. return handle && fseek(handle, position, whence);
  6534. }
  6535. #define _ALS_fseek
  6536. #define fseek FIXES_fseek
  6537. #endif
  6538. /*
  6539. * FIXES_flength(File:handle)
  6540. *
  6541. * FIXES:
  6542. * flength
  6543. */
  6544. #if defined _ALS_flength
  6545. #error _ALS_flength defined
  6546. #endif
  6547. native BAD_flength(File:handle) = flength;
  6548. #if FIX_flength
  6549. stock FIXES_flength(File:handle)
  6550. {
  6551. return handle && flength(handle);
  6552. }
  6553. #define _ALS_flength
  6554. #define flength FIXES_flength
  6555. #endif
  6556. /*
  6557. * FIXES_Kick(playerid)
  6558. *
  6559. * FIXES:
  6560. * Kick
  6561. */
  6562. #if defined _ALS_Kick
  6563. #error _ALS_Kick defined
  6564. #endif
  6565. native BAD_Kick(playerid) = Kick;
  6566. #if FIX_Kick
  6567. forward _FIXES_Kick(playerid);
  6568. public _FIXES_Kick(playerid)
  6569. {
  6570. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_KICKED,
  6571. Kick(playerid);
  6572. }
  6573. #if !FIXES_Single
  6574. forward @FIXES_Kick(playerid);
  6575. public @FIXES_Kick(playerid)
  6576. {
  6577. FIXES_BlockUpdate(playerid, true, 0);
  6578. }
  6579. #endif
  6580. stock FIXES_Kick(playerid)
  6581. {
  6582. if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
  6583. {
  6584. // Disable as much of the server as possible quickly.
  6585. return
  6586. #if FIXES_Single
  6587. FIXES_BlockUpdate(playerid, true, 0),
  6588. #else
  6589. CallRemoteFunction("@FIXES_Kick", "i", playerid),
  6590. #endif
  6591. TogglePlayerSpectating(playerid, true),
  6592. TogglePlayerControllable(playerid, false),
  6593. SetPVarInt(playerid, FIXES_pvarKick, SetTimerEx(FIXES_gscKick, 1000, 0, FIXES_gscSpec@i, playerid)),
  6594. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_KICKED,
  6595. 1;
  6596. }
  6597. else
  6598. {
  6599. return Kick(playerid);
  6600. }
  6601. }
  6602. #define _ALS_Kick
  6603. #define Kick FIXES_Kick
  6604. #endif
  6605. /*
  6606. * FIXES_IsPAttachedObjectSlotUsed(playerid, index)
  6607. *
  6608. * FIXES:
  6609. * IsPlayerAttachedObjectSlotUsed
  6610. */
  6611. #if defined _ALS_IsPAttachedObjSlotUsed
  6612. #error _ALS_IsPAttachedObjSlotUsed defined
  6613. #endif
  6614. native BAD_IsPlayerAttachedObjSlotUsed(playerid, index) = IsPlayerAttachedObjectSlotUsed;
  6615. #if FIX_IsPlayerAttachedObjSlotUsed
  6616. stock FIXES_IsPAttachedObjectSlotUsed(playerid, index)
  6617. {
  6618. if (_FIXES_IS_PLAYER_CONNECTED(playerid))
  6619. {
  6620. return FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] & 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index;
  6621. }
  6622. return 0;
  6623. }
  6624. #define _ALS_IsPAttachedObjSlotUsed
  6625. #define IsPlayerAttachedObjectSlotUsed FIXES_IsPAttachedObjectSlotUsed
  6626. #endif
  6627. /*
  6628. * _FIXES_SetPlayerAttachedObject(slot, to)
  6629. *
  6630. * FIXES:
  6631. * IsPlayerAttachedObjectSlotUsed
  6632. */
  6633. #if (FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject) && !FIXES_Single
  6634. forward _FIXES_SetPlayerAttachedObject(slot, to);
  6635. public _FIXES_SetPlayerAttachedObject(slot, to)
  6636. {
  6637. FIXES_gsObjectSlots[slot] = to;
  6638. }
  6639. #endif
  6640. /*
  6641. * 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)
  6642. *
  6643. * FIXES:
  6644. * IsPlayerAttachedObjectSlotUsed
  6645. * SetPlayerAttachedObject
  6646. */
  6647. #if defined _ALS_SetPlayerAttachedObject
  6648. #error _ALS_SetPlayerAttachedObject defined
  6649. #endif
  6650. 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;
  6651. #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
  6652. 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)
  6653. {
  6654. if (SetPlayerAttachedObject(playerid, index, modelid, bone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ, materialcolor1, materialcolor2))
  6655. {
  6656. #if FIXES_Single
  6657. FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] |= (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index);
  6658. #else
  6659. new
  6660. slot = playerid / _FIXES_ATTACHMENTS;
  6661. CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] | (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));
  6662. #endif
  6663. return 1;
  6664. }
  6665. return 0;
  6666. }
  6667. #define _ALS_SetPlayerAttachedObject
  6668. #define SetPlayerAttachedObject FIXES_SetPlayerAttachedObject
  6669. #endif
  6670. /*
  6671. * FIXES_RemovePlayerAttachedObj(playerid, index)
  6672. *
  6673. * FIXES:
  6674. * IsPlayerAttachedObjectSlotUsed
  6675. */
  6676. #if defined _ALS_RemovePlayerAttachedObject
  6677. #error _ALS_RemovePlayerAttachedObject defined
  6678. #endif
  6679. native BAD_RemovePlayerAttachedObject(playerid, index) = RemovePlayerAttachedObject;
  6680. #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
  6681. stock FIXES_RemovePlayerAttachedObj(playerid, index)
  6682. {
  6683. if (RemovePlayerAttachedObject(playerid, index))
  6684. {
  6685. #if FIXES_Single
  6686. FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index);
  6687. #else
  6688. new
  6689. slot = playerid / _FIXES_ATTACHMENTS;
  6690. CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] & ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));
  6691. #endif
  6692. return 1;
  6693. }
  6694. return 0;
  6695. }
  6696. #define _ALS_RemovePlayerAttachedObject
  6697. #define RemovePlayerAttachedObject FIXES_RemovePlayerAttachedObj
  6698. #endif
  6699. /*
  6700. * _FIXES_DetermineOrder()
  6701. *
  6702. * Figure out which the first filterscript to be called is so that it can do the
  6703. * majority of the work. More detail: Several pieces of code for some fixes
  6704. * rely on things like blocking "OnPlayerUpdate". This should be done in the
  6705. * first script in which "OnPlayerUpdate" is called only, so we need to find out
  6706. * in advance which script will be called first (at least out of all the fixed
  6707. * scripts).
  6708. */
  6709. #if !FIXES_Single
  6710. public _FIXES_DetermineOrder()
  6711. {
  6712. // TODO: Graceful handoff. I thought I was past all this rubbish!
  6713. if (!_FIXES_gIsFilterscript)
  6714. {
  6715. if (existproperty(5, FIXES_gscNoGMProperty))
  6716. {
  6717. return 0;
  6718. }
  6719. // Make sure certain data is synced with what the GM thinks it is.
  6720. // =============================
  6721. // BEGIN: AllowInteriorWeapons
  6722. // =============================
  6723. #if FIX_AllowInteriorWeapons
  6724. CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, !(FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR));
  6725. #endif
  6726. // =============================
  6727. // END: AllowInteriorWeapons
  6728. // =============================
  6729. // ================================
  6730. // BEGIN: SetPlayerAttachedObject
  6731. // ================================
  6732. #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
  6733. for (new i = 0; i != _FIXES_ATTACHMENTS; ++i)
  6734. {
  6735. CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, i, FIXES_gsObjectSlots[i]);
  6736. }
  6737. #endif
  6738. // ==============================
  6739. // END: SetPlayerAttachedObject
  6740. // ==============================
  6741. }
  6742. if (existproperty(5, FIXES_gscOrderProperty))
  6743. {
  6744. // Either this is a Filter Script (1) and we don't want gamemodes
  6745. // (1) or this isn't a filterscript (0) and we do want gamemodes
  6746. // (0). All other cases return here due to a logic mismatch. This
  6747. // is to rectify the difference in call orders between
  6748. // "CallRemoteFunction" and normal callbacks. Now DOESN'T end on
  6749. // the second time round for filterscripts to correctly pass on the
  6750. // data to GameModes.
  6751. if (!existproperty(5, FIXES_gscNoGMProperty) && _FIXES_gIsFilterscript == bool:getproperty(5, FIXES_gscOrderProperty))
  6752. {
  6753. // The game mode is not in charge, which means we are checking
  6754. // the filterscripts a second time and shouldn't be.
  6755. return 0;
  6756. }
  6757. // If this script was previously the owner, and we are not ending
  6758. // the game mode (in which case discard all data), and if we are
  6759. // only dealing with filterscripts or the gamemode is now the
  6760. // master.
  6761. if (FIXES_gsSettings & (e_FIXES_SETTINGS_IN_CHARGE | e_FIXES_SETTINGS_DROP_ALL_DATA) == e_FIXES_SETTINGS_IN_CHARGE)
  6762. {
  6763. FIXES_PRINTF("_FIXES_DetermineOrder: Was in charge");
  6764. // This script is currently in charge, but a new script has
  6765. // usurped it! Pass all relevant data over to the new script.
  6766. // Also, this wasn't triggered by a game mode change (where we
  6767. // just want to dump and reset all data). There is no need to
  6768. // reset the admin teleport data as that is always handled by
  6769. // the Game Mode, so it will either be correct, or it will be
  6770. // blank.
  6771. FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;
  6772. #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  6773. _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
  6774. {
  6775. // =================
  6776. // BEGIN: GameText
  6777. // =================
  6778. #if FIX_GameText
  6779. for (new j = 0; j != FIXES_GT_STYLE_COUNT; ++j)
  6780. {
  6781. PlayerTextDrawDestroy(i, FIXES_gsPGTStyle[i][j]);
  6782. }
  6783. #endif
  6784. // =================
  6785. // END: GameText
  6786. // =================
  6787. // =============================
  6788. // BEGIN: SetPlayerWorldBounds
  6789. // =============================
  6790. #if FIX_SetPlayerWorldBounds
  6791. // I realised that you could have the GM in charge,
  6792. // set their bounds, load an FS, remove their bounds
  6793. // then unload the FS again and it would result in
  6794. // the old GM setting of them HAVING bounds being
  6795. // re-applied, so the check is removed.
  6796. 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]);
  6797. #endif
  6798. // =============================
  6799. // END: SetPlayerWorldBounds
  6800. // =============================
  6801. // =================================
  6802. // BEGIN: TogglePlayerControllable
  6803. // =================================
  6804. #if FIX_TogglePlayerControllable
  6805. CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, i, !(FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_UNCONTROLLABLE));
  6806. #endif
  6807. // =================================
  6808. // END: TogglePlayerControllable
  6809. // =================================
  6810. // ===========================
  6811. // BEGIN: PutPlayerInVehicle
  6812. // ===========================
  6813. #if FIX_PutPlayerInVehicle
  6814. if (FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_PUT_IN_VEHICLE)
  6815. {
  6816. CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iii, i, FIXES_gsVehicleSeatData[i] & 0x00FFFFFF, FIXES_gsVehicleSeatData[i] >>> 24);
  6817. }
  6818. #endif
  6819. // ===========================
  6820. // END: PutPlayerInVehicle
  6821. // ===========================
  6822. }
  6823. #endif
  6824. // =================
  6825. // BEGIN: GameText
  6826. // =================
  6827. #if FIX_GameText
  6828. #if FIX_GameTextStyles
  6829. TextDrawDestroy(FIXES_gsGTStyle[13]),
  6830. TextDrawDestroy(FIXES_gsGTStyle[12]),
  6831. TextDrawDestroy(FIXES_gsGTStyle[11]),
  6832. TextDrawDestroy(FIXES_gsGTStyle[10]),
  6833. TextDrawDestroy(FIXES_gsGTStyle[9]),
  6834. TextDrawDestroy(FIXES_gsGTStyle[8]),
  6835. TextDrawDestroy(FIXES_gsGTStyle[7]),
  6836. #endif
  6837. TextDrawDestroy(FIXES_gsGTStyle[6]),
  6838. TextDrawDestroy(FIXES_gsGTStyle[5]),
  6839. TextDrawDestroy(FIXES_gsGTStyle[4]),
  6840. TextDrawDestroy(FIXES_gsGTStyle[3]),
  6841. TextDrawDestroy(FIXES_gsGTStyle[2]),
  6842. TextDrawDestroy(FIXES_gsGTStyle[1]),
  6843. TextDrawDestroy(FIXES_gsGTStyle[0]);
  6844. #endif
  6845. // =================
  6846. // END: GameText
  6847. // =================
  6848. FIXES_PRINTF("_FIXES_DetermineOrder: Not in charge");
  6849. return 0;
  6850. }
  6851. else
  6852. {
  6853. FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;
  6854. FIXES_PRINTF("_FIXES_DetermineOrder: Not in charge");
  6855. return 0;
  6856. }
  6857. }
  6858. else if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDING))
  6859. {
  6860. setproperty(5, FIXES_gscOrderProperty, _FIXES_gIsFilterscript);
  6861. #if FIXES_Debug
  6862. if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  6863. {
  6864. FIXES_PRINTF("_FIXES_DetermineOrder: Already in charge");
  6865. }
  6866. #endif
  6867. FIXES_gsSettings |= e_FIXES_SETTINGS_IN_CHARGE;
  6868. FIXES_PRINTF("_FIXES_DetermineOrder: Now in charge");
  6869. // =================
  6870. // BEGIN: GameText
  6871. // =================
  6872. #if FIX_GameText
  6873. // Create all the relevant TextDraws.
  6874. _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
  6875. {
  6876. _FIXES_CreateGameTextDraws(playerid);
  6877. }
  6878. _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
  6879. #endif
  6880. // =================
  6881. // END: GameText
  6882. // =================
  6883. return 1;
  6884. }
  6885. else if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDED))
  6886. {
  6887. // Only called when a filterscript that is currently master (and
  6888. // thus called first by "CallRemoteFunction") ends. This doesn't
  6889. // get triggered when a gamemode is master, but that doesn't matter
  6890. // because in that case all the textdraws are destroyed anyway.
  6891. // =================
  6892. // BEGIN: GameText
  6893. // =================
  6894. #if FIX_GameText
  6895. // Destroy all the relevant TextDraws.
  6896. _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
  6897. {
  6898. #if FIX_GameTextStyles
  6899. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
  6900. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
  6901. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
  6902. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
  6903. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
  6904. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
  6905. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
  6906. #endif
  6907. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
  6908. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
  6909. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
  6910. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
  6911. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
  6912. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
  6913. PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
  6914. }
  6915. #if FIX_GameTextStyles
  6916. TextDrawDestroy(FIXES_gsGTStyle[13]),
  6917. TextDrawDestroy(FIXES_gsGTStyle[12]),
  6918. TextDrawDestroy(FIXES_gsGTStyle[11]),
  6919. TextDrawDestroy(FIXES_gsGTStyle[10]),
  6920. TextDrawDestroy(FIXES_gsGTStyle[9]),
  6921. TextDrawDestroy(FIXES_gsGTStyle[8]),
  6922. TextDrawDestroy(FIXES_gsGTStyle[7]),
  6923. #endif
  6924. TextDrawDestroy(FIXES_gsGTStyle[6]),
  6925. TextDrawDestroy(FIXES_gsGTStyle[5]),
  6926. TextDrawDestroy(FIXES_gsGTStyle[4]),
  6927. TextDrawDestroy(FIXES_gsGTStyle[3]),
  6928. TextDrawDestroy(FIXES_gsGTStyle[2]),
  6929. TextDrawDestroy(FIXES_gsGTStyle[1]),
  6930. TextDrawDestroy(FIXES_gsGTStyle[0]);
  6931. #endif
  6932. // =================
  6933. // END: GameText
  6934. // =================
  6935. #if FIXES_Debug
  6936. FIXES_PRINTF("_FIXES_DetermineOrder: Ending");
  6937. #endif
  6938. FIXES_gsSettings |= e_FIXES_SETTINGS_ENDED;
  6939. }
  6940. return 0;
  6941. }
  6942. #endif
  6943. /*
  6944. * FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)
  6945. *
  6946. * FIXES:
  6947. * strins
  6948. */
  6949. #if defined _ALS_strins
  6950. #error _ALS_strins defined
  6951. #endif
  6952. native BAD_strins(string[], const substr[], pos, maxlength = sizeof string) = strins;
  6953. #if FIX_strins
  6954. stock FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)
  6955. {
  6956. if (string[0] > 255)
  6957. {
  6958. new
  6959. strlength = strlen(string),
  6960. sublength = strlen(substr),
  6961. m4 = maxlength * 4;
  6962. // Packed - format doesn't like these strings.
  6963. if (strlength + sublength >= m4)
  6964. {
  6965. if (pos + sublength >= m4)
  6966. {
  6967. return
  6968. string{pos} = '\0',
  6969. // Hopefully this doesn't ignore maxlength and does packed.
  6970. strcat(string, substr, maxlength);
  6971. }
  6972. else
  6973. {
  6974. // pos + sublength is less than maxlength, so this sum MUST
  6975. // be positive and gte than "pos", so there's no need for
  6976. // additional checks.
  6977. string{maxlength - sublength - 1} = '\0';
  6978. }
  6979. }
  6980. return strins(string, substr, pos, maxlength);
  6981. }
  6982. else if (substr[0] > 255)
  6983. {
  6984. new
  6985. strlength = strlen(string),
  6986. sublength = strlen(substr);
  6987. // Packed - format doesn't like these strings.
  6988. if (strlength + sublength >= maxlength)
  6989. {
  6990. if (pos + sublength >= maxlength)
  6991. {
  6992. return
  6993. string[pos] = '\0',
  6994. // Hopefully this doesn't ignore maxlength and does packed.
  6995. strcat(string, substr, maxlength);
  6996. }
  6997. else
  6998. {
  6999. // pos + sublength is less than maxlength, so this sum MUST
  7000. // be positive and gte than "pos", so there's no need for
  7001. // additional checks.
  7002. string[maxlength - sublength - 1] = '\0';
  7003. }
  7004. }
  7005. return strins(string, substr, pos, maxlength);
  7006. }
  7007. else
  7008. {
  7009. return format(string, maxlength, "%.*s%s%s", pos, string, substr, string[pos]);
  7010. }
  7011. }
  7012. #define _ALS_strins
  7013. #define strins FIXES_strins
  7014. #endif
  7015. /*
  7016. * _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync)
  7017. *
  7018. * FIXES:
  7019. * ApplyAnimation_2
  7020. */
  7021. #if FIX_ApplyAnimation_2
  7022. forward _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync);
  7023. public _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync)
  7024. {
  7025. ApplyAnimation(playerid, FIXES_gscAnimLib[animlib], FIXES_gsClassAnimName[playerid], fDelta, loop, lockx, locky, freeze, time, forcesync),
  7026. FIXES_gsAnimTimer[playerid] = 0;
  7027. }
  7028. #endif
  7029. /*
  7030. * FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)
  7031. *
  7032. * FIXES:
  7033. * ApplyAnimation
  7034. * ApplyAnimation_2
  7035. */
  7036. #if defined _ALS_ApplyAnimation
  7037. #error _ALS_ApplyAnimation defined
  7038. #endif
  7039. native BAD_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0) = ApplyAnimation;
  7040. #if FIX_ApplyAnimation || FIX_ApplyAnimation_2
  7041. stock FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)
  7042. {
  7043. new
  7044. diff,
  7045. idx = animlib[0] & ~0x20;
  7046. // Uses a sort of optimised binary search. The code first identifies the area in the array
  7047. // in which libraries with this first letter are, then does a binary search using only that
  7048. // subset of the array. This used to use an N-ary search that just went linearly through
  7049. // the identified subset of the array, and that was 5x faster than a simple linear loop over
  7050. // the whole array. This new version is 50% faster than even that was. "E" has no
  7051. // libraries, but we don't check for that explicitly as it would slow down the more common
  7052. // code path - and it ends fairly quickly anyway as "upper == lower".
  7053. if (_FIXES_IN_RANGE(idx, 'A', 'W' + 1))
  7054. {
  7055. new
  7056. upper = FIXES_gscAnimIndexes[idx - ('A' - 1)],
  7057. lower = FIXES_gscAnimIndexes[idx - 'A'];
  7058. while (upper != lower)
  7059. {
  7060. idx = (upper - lower) / 2 + lower;
  7061. if ((diff = strcmp(FIXES_gscAnimLib[idx], animlib, true)))
  7062. {
  7063. if (diff > 0) upper = idx;
  7064. else lower = idx + 1;
  7065. }
  7066. else
  7067. {
  7068. // If we hit the "else" branch, we have found the correct
  7069. // animation library from the n-ary search.
  7070. #if FIX_ApplyAnimation_2
  7071. if (FIXES_gsAnimTimer[playerid])
  7072. {
  7073. KillTimer(FIXES_gsAnimTimer[playerid]),
  7074. FIXES_gsAnimTimer[playerid] = 0;
  7075. }
  7076. if (FIXES_gsPlayerAnimLibs[playerid][idx >>> 5] & (1 << (idx & 0x1F)))
  7077. {
  7078. FIXES_gsPlayerAnimLibs[playerid][idx >>> 5] &= ~(1 << (idx & 0x1F)),
  7079. FIXES_gsClassAnimName[playerid][0] = '\0',
  7080. strcat(FIXES_gsClassAnimName[playerid], animname),
  7081. FIXES_gsAnimTimer[playerid] = SetTimerEx("_FIXES_ApplyAnimation", 350, false, "ddfdddddd", playerid, idx, fDelta, loop, lockx, locky, freeze, time, forcesync);
  7082. }
  7083. #endif
  7084. return ApplyAnimation(playerid, animlib, animname, fDelta, loop, lockx, locky, freeze, time, forcesync);
  7085. }
  7086. }
  7087. }
  7088. return 0;
  7089. }
  7090. #define _ALS_ApplyAnimation
  7091. #define ApplyAnimation FIXES_ApplyAnimation
  7092. #endif
  7093. /*
  7094. * FIXES_random(max)
  7095. *
  7096. * FIXES:
  7097. * random
  7098. */
  7099. #if defined _ALS_random
  7100. #error _ALS_random defined
  7101. #endif
  7102. native BAD_random(max) = random;
  7103. #if FIX_random
  7104. stock FIXES_random(max)
  7105. {
  7106. if (max < 0)
  7107. {
  7108. return -random(-max);
  7109. }
  7110. else
  7111. {
  7112. return random(max);
  7113. }
  7114. }
  7115. #define _ALS_random
  7116. #define random FIXES_random
  7117. #endif
  7118. /*
  7119. * _FIXES_SetCamera
  7120. *
  7121. * FIXES:
  7122. * SetPlayerCamera
  7123. */
  7124. #if FIX_SetPlayerCamera
  7125. forward _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z);
  7126. public _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z)
  7127. {
  7128. if (type)
  7129. {
  7130. SetPlayerCameraPos(playerid, x, y, z);
  7131. }
  7132. else
  7133. {
  7134. SetPlayerCameraLookAt(playerid, x, y, z);
  7135. }
  7136. return 0;
  7137. }
  7138. #endif
  7139. /*
  7140. * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
  7141. *
  7142. * FIXES:
  7143. * SetPlayerCamera
  7144. */
  7145. #if defined _ALS_SetPlayerCameraPos
  7146. #error _ALS_SetPlayerCameraPos defined
  7147. #endif
  7148. native BAD_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraPos;
  7149. #if FIX_SetPlayerCamera
  7150. stock FIXES_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z)
  7151. {
  7152. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  7153. {
  7154. #if FIXES_Single
  7155. if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
  7156. #else
  7157. if (GetPVarInt(playerid, pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
  7158. #endif
  7159. {
  7160. SetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 1, x, y, z);
  7161. }
  7162. else
  7163. {
  7164. SetPlayerCameraPos(playerid, x, y, z);
  7165. }
  7166. }
  7167. return 0;
  7168. }
  7169. #define _ALS_SetPlayerCameraPos
  7170. #define SetPlayerCameraPos FIXES_SetPlayerCameraPos
  7171. #endif
  7172. /*
  7173. * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
  7174. *
  7175. * FIXES:
  7176. * SetPlayerCamera
  7177. */
  7178. #if defined _ALS_SetPlayerCameraLookAt
  7179. #error _ALS_SetPlayerCameraLookAt defined
  7180. #endif
  7181. native BAD_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraLookAt;
  7182. #if FIX_SetPlayerCamera
  7183. stock FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
  7184. {
  7185. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  7186. {
  7187. #if FIXES_Single
  7188. if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
  7189. #else
  7190. if (GetPVarInt(playerid, pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
  7191. #endif
  7192. {
  7193. SetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 2, x, y, z);
  7194. }
  7195. else
  7196. {
  7197. SetPlayerCameraLookAt(playerid, x, y, z);
  7198. }
  7199. }
  7200. return 0;
  7201. }
  7202. #define _ALS_SetPlayerCameraLookAt
  7203. #define SetPlayerCameraLookAt FIXES_SetPlayerCameraLookAt
  7204. #endif
  7205. /*
  7206. * FIXES_TogglePlayerSpectating(playerid, toggle)
  7207. *
  7208. * FIXES:
  7209. * SetPlayerCamera
  7210. */
  7211. #if defined _ALS_TogglePlayerSpectating
  7212. #error _ALS_TogglePlayerSpectating defined
  7213. #endif
  7214. native BAD_TogglePlayerSpectating(playerid, toggle) = TogglePlayerSpectating;
  7215. #if FIX_SetPlayerCamera
  7216. stock FIXES_TogglePlayerSpectating(playerid, toggle)
  7217. {
  7218. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  7219. {
  7220. if (toggle)
  7221. {
  7222. #if FIXES_Single
  7223. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_SPECTATING;
  7224. #else
  7225. DeletePVar(playerid, FIXES_pvarPlayerSpectate);
  7226. #endif
  7227. }
  7228. else
  7229. {
  7230. #if FIXES_Single
  7231. FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_SPECTATING;
  7232. #else
  7233. SetPVarInt(playerid, FIXES_pvarPlayerSpectate, 1);
  7234. #endif
  7235. }
  7236. return TogglePlayerSpectating(playerid, toggle);
  7237. }
  7238. return 0;
  7239. }
  7240. #define _ALS_TogglePlayerSpectating
  7241. #define TogglePlayerSpectating FIXES_TogglePlayerSpectating
  7242. #endif
  7243. /*
  7244. * FIXES_SetPlayerTime(playerid, hour, minute)
  7245. *
  7246. * FIXES:
  7247. * SetPlayerTime
  7248. */
  7249. #if defined _ALS_SetPlayerTime
  7250. #error _ALS_SetPlayerTime defined
  7251. #endif
  7252. native BAD_SetPlayerTime(playerid, hour, minute) = SetPlayerTime;
  7253. #if FIX_SetPlayerTime
  7254. forward _FIXES_SetTime(playerid, hour, minute);
  7255. public _FIXES_SetTime(playerid, hour, minute)
  7256. {
  7257. if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
  7258. {
  7259. return SetPlayerTime(playerid, hour, minute);
  7260. }
  7261. return 0;
  7262. }
  7263. stock FIXES_SetPlayerTime(playerid, hour, minute)
  7264. {
  7265. if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  7266. {
  7267. if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
  7268. {
  7269. return SetTimerEx(FIXES_gscSetTime, 250, 0, FIXES_gscSpec@iii, playerid, hour, minute);
  7270. }
  7271. return SetPlayerTime(playerid, hour, minute);
  7272. }
  7273. return 0;
  7274. }
  7275. #define _ALS_SetPlayerTime
  7276. #define SetPlayerTime FIXES_SetPlayerTime
  7277. #endif
  7278. /*
  7279. * FIXES_sleep(const time)
  7280. *
  7281. * FIXES:
  7282. * sleep
  7283. */
  7284. // Uses a little trick to consume part of the line and thus not match
  7285. // our hooked version.
  7286. #if defined _ALS_sleep
  7287. #error _ALS_sleep defined
  7288. #endif
  7289. #define BAD_sleep%0\n%9 sleep%0
  7290. #if FIX_sleep
  7291. stock FIXES_sleep(ms)
  7292. {
  7293. // Call a native function that does very little, but saves the current
  7294. // heap pointer. Then return to save the accurate stack pointer.
  7295. return heapspace(), ms;
  7296. }
  7297. #define _ALS_sleep
  7298. #define sleep%0\n%9 sleep FIXES_sleep(%0)
  7299. // This fixes another BIZZARE bug. Just doing:
  7300. //
  7301. // #define FIXES_sleep(%0;) FIXES_sleep(%0)
  7302. //
  7303. // Results in:
  7304. //
  7305. // FIXES_sleep(n));
  7306. //
  7307. // Which clearly it shouldn't. I've stepped through the compilation and that
  7308. // extra bracket comes from nowhere!
  7309. #define FIXES_sleep(%0;) FIXES_sleep _FIXES_SLEEP_BRACKET %0);
  7310. #define _FIXES_SLEEP_BRACKET (
  7311. #endif
  7312. /*
  7313. * _FIXES_AddInternal(array[], value, size)
  7314. *
  7315. * Add something to an internal linked list.
  7316. */
  7317. static stock _FIXES_AddInternal(array[], value, size)
  7318. {
  7319. if (array[value] <= value)
  7320. {
  7321. new
  7322. last = size,
  7323. next = array[last];
  7324. while (next < value)
  7325. {
  7326. last = next,
  7327. next = array[last];
  7328. }
  7329. array[next - 1] = value + 1,
  7330. array[(value - 1) % (size + 1)] = (last + 1) % (size + 1),
  7331. array[last] = value,
  7332. array[value] = next;
  7333. }
  7334. }
  7335. /*
  7336. * _FIXES_RemoveInternal(array[], value, size)
  7337. *
  7338. * Remove something from an internal linked list.
  7339. */
  7340. static stock _FIXES_RemoveInternal(array[], value, size)
  7341. {
  7342. if (array[value] > value)
  7343. {
  7344. static
  7345. last;
  7346. // Adjustment for easier "mod"ing.
  7347. ++size,
  7348. last = (array[(value - 1) % size] - 1) % size,
  7349. // Store the reverse value here as well as in the previous slot.
  7350. array[value] =
  7351. // Copy the next value to the last value.
  7352. array[(array[last] = array[value]) - 1] =
  7353. // Set the reverse iterator value.
  7354. (last + 1) % size;
  7355. }
  7356. }
  7357. #undef _FIXES_CEILDIV
  7358. #undef _FIXES_INFINITY
  7359. #undef _FIXES_N_INFINITY
  7360. #undef _FIXES_ATTACHMENTS
  7361. #undef _FIXES_FOREACH
  7362. #undef _FIXES_IS_UNSET
  7363. #undef _FIXES_IS_IN_CHARGE
  7364. #undef _FIXES_IN_RANGE
  7365. #undef _FIXES_NO_RANGE
  7366. #undef _FIXES_FORWARD
  7367. #undef _FIXES_IS_PLAYER_CONNECTED
  7368. #undef FIXES_PRINTF
  7369. #endinput
  7370. // Fix inclusion template.
  7371. #if !defined FIX_NameOfFixHere
  7372. #define FIX_NameOfFixHere (1)
  7373. #elseif _FIXES_IS_UNSET(FIX_NameOfFixHere)
  7374. #undef FIX_NameOfFixHere
  7375. #define FIX_NameOfFixHere (2)
  7376. #endif
  7377. // Fix function template.
  7378. /*
  7379. * FIXES_NameOfFixHere
  7380. *
  7381. * FIXES:
  7382. * NameOfFixHere
  7383. */
  7384. #if defined _ALS_NameOfFixHere
  7385. #error _ALS_NameOfFixHere defined
  7386. #endif
  7387. native BAD_NameOfFixHere(params) = NameOfFixHere;
  7388. #if FIX_NameOfFixHere
  7389. stock FIXES_NameOfFixHere(params)
  7390. {
  7391. return 0;
  7392. }
  7393. #define _ALS_NameOfFixHere
  7394. #define NameOfFixHere FIXES_NameOfFixHere
  7395. #endif