To jest na prawde bardzo dobre narzędzie dla pluginów, które zależy na nożu takim jak noż RPG jailbreak i serwerów takiego typu.Tworzenie takich noży, przez to staną sie bezproblemowe oprócz gry, zwłaszcza w połączeniu z niestandardową poświatą.
Może i nie zerżnięte w całościowo z translatora, ale nad tłumaczeniem mogłeś się bardziej postarać
@@ EDIT
Masz tutaj tłumaczenie. Jeśli chesz, popodmieniaj:
Możliwości topPoczątkowo plugin miał trafić do mojego nadchodzącego RolePlaying mod'a, jednak nie mogłem znaleźć żadnego pluginu podobnego do tego, więc zdecydowałem się na przedpremierowe wydanie go (tak, jak Database ORM).
Knife API makes adding new knives a breeze due to the knife pickup/switching/dropping mechanism it provides (tego nie rozumiem ). Tym sposobem, wszystkie noże są dodane standardową metodą. Wersja 2.0 dodaje wiele nowych możliwości i funckji do pluginu
Jeśli masz wiele noży, możesz przełączać się między nimi (lub, w zależności od cvaru, używająć menu) klawiszem R (+reload).
UWAGA: Pluginy napisane na podstawie Knife API <2.0 NIE SĄ KOMPATYBILNE z nową wersją. Będziesz musiał przerobić Twój stary plugin. Przepraszam, mam nadzieję, że to się więcej nie powtórzy!
Wymagania Jest to doskonałe narzędzie dla pluginów, które bazują na nożach (jak serwery z modami nożowymi, np. RolePlaying(), jailbreak etc.). Tworzenie noży przez ten plugin sprawi wrażenie zintegrowania pluginu z modem(?), szczególnie, kiedy będzie oparty na podstawowych sprite'ach (?).
Co plugin może robić:
- Przydziela podstawowe dodatko (jak modele i dźwięki) do nowo utworzonego noża
- Standardowe sprite'y noża, zobacz przykłady
- Standardowy zasięg noża
- Dodatkowy odstęp czasowy pomiędzy odtworzeniem animacji
- Łapie eventy, takie jak atakowanie/wyciąganie broni z większą płynnością
- Etc.
Co plugin nie może robić:
- Mimo, iż plugin robi bardzo dużo, musisz włożyć trochę pracy w stworzenie czegoś
- Niewiele rzeczy może nie zrobić. Nie może zmienić Cię w kanapkę
Instalacja, konfiguracja topWymagane są:
- OBECNIE NIC! YAAY!
Aby zainstalować:
Zainstaluj jak każdy inny plugin. Pobierz sma, skompiluj i pozwól innym pluginom korzystać z jego możliwości
Aby skonfigurować:
Standardowo, nóż CS został usunięty i zastąpiony rękoma (jak na JailBreake'u). Jeśli chcesz to zmienić, zakomentuj #define DEFAULT_HANDS w sma w linijce nr. 59. Jeśli to zrobisz, nie będziesz musiał pobierać żadnych plików.
Żeby skonfigurować standardowe wartości noża/rąk , edytuj fukcję __addDefaultKnife() w sma w linijce 203.
Użyj następujących cvarów, aby zmienić podstawowe fukcje pluginu:
- knifeapi_dropondeath (standardowo:1) - czy noże, które można wyrzucić, będą wyrzucane przy śmierci gracza? Nie usuwa to go graczom. Musisz także użyć knifeapi_lossondeath!
- knifeapi_lossondeath (standardowo:1) - czy po śmierci gracze gubią wszystkie noże (wszystkie noże z wyjątkiem podstawowego)?
- knifeapi_switchmenu (standardowo:1) - czy po kliknieciu R ma pokazać się menu z wyborem noży, czy mają się zmieniać po kolei?
- knifeapi_roundremoval (standardowo:1) - czy wyrzucone noże mają zostać usunięte na końcu rundy?
API (Natywy i forwardy) top
Natywy i forwardy będą wyjaśnione w pliku .inc. Nie powie Ci to nic, jeśli chodzi o pisanie pluginów, w tym celu powinieneś obejrzeć przykłady.
// Nie wiem dokładnie co to robi.
#pragma library "knifeapi"
/**************************************************
************ API ENUMS AND STRUCTURES ************
*************************************************/
enum KnifeProperties
{
KN_STR_WeaponName, // nazwa broni, pokazana w menu
KN_STR_VModel, // ścieżka do modelu v_ (models/....)
KN_STR_PModel, // ścieżka do modelu p_ (models/....)
KN_STR_WModel, // ścieżka do modelu w_ (models/....)
KN_STR_DeploySound, // ścieżka do dźwięku wyciągania noża
KN_STR_SlashSound, // ścieżka do dźwięku cięcia nożem
KN_STR_StabSound, // ścieżka do dźwięku ataku nożem
KN_STR_WhiffSound, // ścieżka do dźwięku ataku nożem (pudło)
KN_STR_WallSound, // ścieżka do dźwięku po ścianie
KN_STR_SpriteName, // jeśli używasz standardowego, zmień to na nazwę pliku .txt (np. weapon_custom) - NIE ZMIEINAJ TEGO, JEŚLI NIE UŻYWASZ STANDARDOWEGO SPRITE'A!!!
KN_CLL_Droppable, // czy da się go wyrzucić?
KN_CLL_PrimaryDamage, // mnożnik DMG z LPM (1.0 - standardowe obrażenia, 2.0 - podwojne obrazenia etc.)
KN_CLL_SecondaryDamage, // mnożnik DMG z PPM (1.0 - standardowe obrażenia, 2.0 - podwojne obrazenia etc.)
KN_CLL_PrimaryNextAttack, // czas pomiędzy atakami z LPM
KN_CLL_SecondaryNextAttack, // czas pomiędzy atakami z PPM
KN_CLL_PrimaryRange, // zasięg ataku LPM
KN_CLL_SecondaryRange, // zasięg ataku PPM
KN_CLL_PrimaryDamageDelay, // odstep pomiędzy naciśnięciem klawisza, a atakiem aktualnego noża z LPM
KN_CLL_SecondaryDamageDelay,// odstep pomiędzy naciśnięciem klawisza, a atakiem aktualnego noża z PPM
KN_CLL_PrimaryDmgBits, // tak jak DMG_BULLET | DMG_ALWAYSGIB (ustawiają wybuch gracza), DMG_BULLET | DMG_NEVERGIB standardowo dla LPM
KN_CLL_SecondaryDmgBits, // tak jak DMG_BULLET | DMG_ALWAYSGIB (ustawiają wybuch gracza), DMG_BULLET | DMG_NEVERGIB standardowo dla PPM
KN_CLL_TeamLock, // jeśli 0, przeciwna drużyna nie będzie mogła podnieść noża
KN_CLL_NextAttackDependency,// jeśli true, LPM również zmienia następny atak PPM na tą samą wartośc (i na odwrót); standardowo true
KN_CLL_IgnoreFriendlyFire // ignorowac friendly fire?
};
enum _:ForwardReturns
{
KnifeAction_Block = 5,
KnifeAction_DoNothing
};
/****************************************
************ PLUGIN NATIVES ************
***************************************/
/* Knife_Register(): rejestruje noz.
* @params: zobacz KnifeProperties, są takie same
* @info: możesz uzyć dodatkowych ustawieć z Knife_SetProperty
* @return: (Int) wskaźnik noża
*/
native Knife_Register(
const WeaponName[] = "New Knife",
const VModel[],
const PModel[] = "",
const WModel[] = "",
const DeploySound[] = "weapons/knife_deploy1.wav",
const SlashSound[] = "weapons/knife_hit1.wav",
const StabSound[] = "weapons/knife_stab.wav",
const WhiffSound[] = "weapons/knife_slash1.wav",
const WallSound[] = "weapons/knife_hitwall1.wav",
Float:PrimaryDamage = 1.0,
Float:SecondaryDamage = 1.0
);
/* Knife_GetTotal(): zwraca ilość zarejestrowanych noży.
* @info: prosta pętla: for(new i=1; i<=Knife_GetTotal(); i++)
* @return: (Int) wartośc noży zarejestrowanych
*/
native Knife_GetTotal();
/* Knife_GetProperty(): zwraca właściciela noża z enuma KnifeProperties.
* @param (Int) Knife: index noża
* @param (Int) Value: wartość z enuma KnifeProperties
* @params (any...): Jeśli używasz wartości KN_STR_X, następne 2 parametry są tablicą i jej rozmiarem,
w innym razie jest to tylko tablica cell, do ktorej dane są zapisywane przez referencje
* @return: (Int) 1 - poprawnie, 0 - error
*/
native Knife_GetProperty(Knife, KnifeProperties:Value, any:...);
/* Knife_SetProperty(): Ustawia właściciela noża z enuma KnifeProperties.
* @param (Int) Knife: index noża
* @param (Int) Value: wartość z enuma KnifeProperties
* @params (any...): String/cell z wartością
* @return: (Int) 1 - poprawnie, 0, error
*/
native Knife_SetProperty(Knife, KnifeProperties:Value, any:...);
/* Knife_PlayerGive(): Daje nóż graczowi.
* @param (Int) Player: Index gracza
* @param (Int) Knife: index noża
* @param (bool) Set: jeśli true, gracz dostanie nóż do ręki
* @return: (Int) 1 - poprawnie, 0 - error
*/
native Knife_PlayerGive(Player, Knife, bool:Set = true);
/* Knife_PlayerGetCurrent(): zwraca aktualny nóż trzymany przez gracza.
* @param (Int) Player: index gracza
* @return: (Int) 0 - standardowy nóż, X - ID noża, -1 - error/niepowodzenie
*/
native Knife_PlayerGetCurrent(Player);
/* Knife_PlayerSetCurrent(): Wyciąga nóż graczowi. Musi on go posiadać
* @param (Int) Player: Index graczam któremu ma się wyciągnąć nóż
* @param (Int) Knife: index noża
* @return: (Int) 1 - poprawnie, 0 - error
*/
native Knife_PlayerSetCurrent(Player, Knife);
/* Knife_PlayerHas(): sprawdza, czy gracz ma nóż
* @param (Int) Player: Index gracza
* @param (Int) Knife: index noża
* @return: (Int) 1 - posiada, 0 - niepowodzenie/error/nie posiada
*/
native Knife_PlayerHas(Player, Knife);
/* Knife_PlayerSetLock(): Nie pozwala graczowi na zmianę noża
* @param (Int) Player: Index gracza
* @param (Bool) Locked: Status blokady - true: zablokowany, false: odblokowany
* @return: nic
*/
native Knife_PlayerSetLock(Player, bool:Locked);
/* Knife_PlayerGetLock(): Sprawdza, czy gracz ma zablokowaną zmianę noża
* @param (Int) Player: Index gracza
* @return: (Bool) true: zablokowany, false: odblokowany
*/
native bool:Knife_PlayerGetLock(Player);
/* Knife_PlayerRemoveAll(): zabiera graczowy wszystkie noże, z wyjątkiem standardowego.
* @param (Int) Player: Index gracza
* @return: nothing
*/
native Knife_PlayerRemoveAll(Player);
/**********************************
************ FORWARDS ************
*********************************/
/* KnifeAction_ProcessAttack_Pre(): Wywoływany, kiedy atak się wywoła.
Pre hook: Wywoływany przed odstępem animacji, jeśli takowa istnieje.
Możesz zablokować tę akcję przez KnifeAction_Block.
* @param (Int) Player: Index gracza (atakujacy)
* @param (Int) Knife: index noża
* @param (bool) PrimaryAttack: true: tak, false: nie
*/
forward KnifeAction_ProcessAttack_Pre(Player, Knife, bool:PrimaryAttack);
/* KnifeAction_ProcessAttack_Post(): Wywoływany, gdy gracz zaatakować drugiego.
Post hook: Wywoływany po odstępie animacji, jeśli takowa istnieje.
Nie możesz zablokować tego forwardu. Zamiast tego zablokuj KnifeAction_DealDamage.
* @param (Int) Player: Index gracza (atakujacy)
* @param (Int) Victim: Gracz otrzymujacy obrazenia. Jeśli nie było ofiary (ściana/powietrze), index ma wartość 0.
* @param (Int) Knife: index noża
* @param (bool) PrimaryAttack: true: tak, false: nie
* @param (Vector) EndPoint: Końcowy punkt zasięgu noża. Jest to origin, gdzie obrażenie się dokonało.
Zalecam używania standardowych sprite'ów przy używaniu tego.
* @param (Vector) AimVector: kierunek patrzenia gracza
*/
forward KnifeAction_ProcessAttack_Post(Player, Victim, Knife, bool:PrimaryAttack, Float:EndPoint[3], Float:AimVector[3]);
/* KnifeAction_DealDamage(): Wywoływany tuż przez zadaniem obrażeń
Pre hook: Możesz zablokować tę akcję przez KnifeAction_Block.
* @param (Int) Attacker: index gracza (ataklujacy)
* @param (Int) Victim: gracz otrzymujacy obrazenia
* @param (Int) Knife: index noża
* @param (Float) Damage: obrażenia zadane z uwzględnieniem: hitboxów/ciosu w plecy/standardowy mnożnik obrażeń
* @param (bool) PrimaryAttack: true: tak, false: nie
* @param (Vector) EndPoint: Końcowy punkt ataku noża - origin, gdzie obrażenia są wysyłane
Zalecam używanie standardowych sprite'ów podczas używania tego
* @param (Vector) AimVector: Kierunek patrzenia gracza
* @param (Int) Hitzone: Hitzone, np. HIT_HEAD.
*/
forward KnifeAction_DealDamage(Attacker, Victim, Knife, Float:Damage, bool:PrimaryAttack, DamageBits, bool:Backstab,
Float:EndPoint[3], Float:AimVector[3], Hitzone
);
/* KnifeAction_Deploy(): Wywoływane, kiedy gracz wyciągnie nóż.
Post hook: nie możesz zablokować tego forwardu.
* @param (Int) Attacker: index gracza
* @param (Int) Knife: index noża
*/
forward KnifeAction_Deploy(Player, Knife);
/* KnifeAction_SoundPlay(): Wywoływany, kiedy dźwięki noża mają zostać odtworzone.
Pre hook: Możesz zablokować ta akcję przez KnifeAction_Block.
* @param (Int) Player: Index gracza
* @param (Int) Knife: index noża
* @param (String) Sound: odtwarzany dźwięk
*/
forward KnifeAction_SoundPlay(Player, Knife, const Sound[]);