fixes.inc 256 KB

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