Pro Pawn - Портал о PAWN-скриптинг

fixes.inc - корекции на грешки в SA-MP

Описание Написани от общността корекции на грешки в SA-MP.

Въведение SA-MP е тестваем софтуер, написан от малък екип в свободното им време, може да съдържа грешки (както всеки друг софтуер). Някои от тях са известни отдавна, но имат нисък приоритет поради незначителните си ефекти, други просто не са коригирани дълго време. Много от тези грешки имат решения, които могат да бъдат внедрени с Pawn (и може да са по-лесни от прилагането им в изходния код на SA-MP). Целта на този скрипт е да комбинира възможно най-много корекции в една библиотека, която е лесна за използване от всички.

Използване на За да използвате този скрипт, просто го активирайте, след като включите стандартните SA-MP функции, но преди други библиотеки:

Всички имена на корекции имат отделни думи и всички те, заедно с тяхното описание, са изброени по-долу.

Ако имате само един изпълняван скрипт на вашия сървър (т.е. без филтър за скриптове), можете да използвате следната настройка, за да подобрите кода fixes.inc:

Настройки Има няколко настройки за подобряване на производителността на този скрипт. Задайте тези знаци като "1", преди да включите fixes.inc (премахнете ги или ги задайте на 0, за да ги деактивирате):

  • FIXES_Single - Имате само един работещ скрипт (без филтърни скриптове), опростява кода.
  • FIXES_SilentKick – Когато играч бъде ритан за забранени модификации/превозни средства, не му изпращайте съобщение.
  • FIXES_Debug - Допълнителна информация в конзолата на сървъра.

Някои корекции са деактивирани по подразбиране, но можетеактивиране:

Добавка Файлът е доста добре документиран, със списък с корекции на грешки в горната част. Ако знаете за други грешки или имате някакви решения за тях, би било хубаво да ги публикувате в тази тема (според използваната структура). Тази библиотека също трябва да бъде щателно тествана, за да открие грешки в корекциите.

Ето няколко други библиотеки, насочени към коригиране на други сериозни проблеми:

  • Fixes2 - Y_Less поправя "SetTimer", "SetTimerEx" и други.
  • SQLitei – Поправки на Slice и подобрения на много функции на SQLite
  • Корекция на таймера - Корекция на части, за да направи "SetTimer" и "SetTimerEx" по-точни.

Най-вероятната причина за грешките е деактивирането на някои пачове. Някои корекции са взаимозависими и ТРЯБВА да работят дори когато свързаните с тях корекции са деактивирани, не всяка комбинация е тествана. Има буквално милиарди възможни комбинации - ако намерите такава, която не се компилира или не работи, моля, уведомете ни.

Относно превода Нямам нормални познания по английски, преведох набързо, така че може да има грешки в текста. Можете да докладвате за тези грешки в тази тема.

Изтеглете

  • Винаги можете да намерите най-новата версия на GitHub.

Също така оставих въпрос относно корекцията на GetPlayerWeapon в GitHub

Също така предлагам да се интегрира корекция за грешка с наблюдение, когато наблюдаваният играч промени виртуалния свят, умре или се изключи

Проверихте ли работата на обикновен GameText? Нещо ми подсказва, че правят абсолютно същото. Тогава ще проверя.

Видях как ще се появи времето и желанието да го направя.

Също така предлагам да се интегрира корекциядо грешка с наблюдение, когато наблюдаваният играч промени виртуалния свят, умре или прекъсне връзката

Проверен, не изчезва

Има ли идея как да го оправя? Аз самият се опитах да напиша патерица, но все още не работи. Ето какво имам: - Прихващам функциите GivePlayerWeapon, SetPlayerAremdWeapon, ResetPlayerWeapons и съхранявам weaponid's в променливи в тях и ги нулирам напълно, когато ResetPlayerWeapons. - Прихващане на функцията GetPlayerWeapon и връщане на стойността от променливата в нея

Но всичко опира до една дреболия, както вече писах в Github, 3 вида оръжия (UZI, MP-5 и TEC-9) са в ръцете на "автоматичен" при кацане в кола. „Автоматично“ в кавички, защото това не винаги е така, понякога това не се случва.

Имам нужда от тази корекция сега и ако има решение, моля, опишете го накратко, ще се опитам да го внедря.

1 сек, плюс в GivePlayerWeapon нещо подобно, така че водачите да се хвърлят на раменете, а не в ръцете.

Корекция наGetPlayerWeapon(би било по-точно да се каже, че е финализирана, защото досега имаше само корекция наSetPlayerArmedWeaponв колата:

За да се коригира SetPlayerArmedWeapon в прихващача на тази функция, weaponid беше записан в променливи само ако играчът е в превозно средство. И когато играчът си тръгна, те въведоха стойността -1. Същата стойност беше зададена по подразбиране, когато плейърът се свърза. Прехващачът GetPlayerWeapon обърна внимание на това: ако променливата съдържа -1, тогава върнете оригиналната функция, в противен случай стойността от нашата променлива. Моята корекция се придържа към същия принцип и току-що добавих:

stock FIXES_GivePlayerWeapon (playerid, weaponid, амуниции) new vid = GetPlayerVehicleID;

if( vid ) // код на друга корекция

#if FIX_GetPlayerWeapon #if FIXES_Single FIXES_gsPlayerWeapon [playerid] = weaponid; #else SetPVarInt (playerid, FIXES_pvarPlayerWeapon, weaponid); #endif #endif > >

// Нов прехватчик #if дефиниран _ALS_ResetPlayerWeapons #error _ALS_ResetPlayerWeapons дефиниран #endif native BAD_ResetPlayerWeapons (playerid) = ResetPlayerWeapons;

запас FIXES_ResetPlayerWeapons (playerid) < if( IsPlayerInAnyVehicle (playerid)) < #if FIXES_Single FIXES_gsPlayerWeapon [playerid] = 0; #else SetPVarInt (playerid, FIXES_pvarPlayerWeapon, 0); #endif >

връщане ResetPlayerWeapons (playerid); > #define _ALS_ResetPlayerWeapons #define ResetPlayerWeapons FIXES_ResetPlayerWeapons

public OnPlayerStateChange (playerid, newstate, oldstate) // код на друга фикса

// ==================== // НАЧАЛО: GetPlayerWeapon // ==================== #if FIX_GetPlayerWeapon if( newstate == PLAYER_STATE_DRIVER ) ново оръжие, амуниции; // Micro SMG/Uzi, MP5, TEC-9 са в 4-ти слот GetPlayerWeaponData (playerid, 4, оръжие, амуниции); if( оръжие) SetPlayerArmedWeapon (playerid, оръжие);

#ако е дефинирано FIXES_Single FIXES_gsPlayerWeapon [playerid] = оръжие; #else SetPVarInt (playerid, FIXES_pvarPlayerWeapon, weaponid); #endif > > #endif // ==================== // КРАЙ: GetPlayerWeapon // ==================== >

P.S С парашютом заморачиваться няма нужда, тъй като той се убира само когато играчът осознанно се засади, и за това време кулак (id 0) се запомня само. А при неопознанном парашют "остается в ръцете".