Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

BaQStiC - zdjęcie

BaQStiC

Rejestracja: 25.09.2010
Aktualnie: Nieaktywny
Poza forum Ostatnio: 12.07.2019 18:38
-----

#307752 Generator klas COD Mod

Napisane przez R3X w 14.10.2011 18:40

Przygotowaliśmy dla Was Generator klas (link również w menu Dodatki AMXX)

Wypełnij formularz i pobierz własną klasę do nowego Cod moda. Oprócz wyboru broni i statystyk klasy możliwe jest też dołączanie różnych dodatków. Na razie jest ich kilka, niedługo będą kolejne.

Mam nadzieję, że się przyda :)
  • +
  • -
  • 98


#303879 [ROZWIĄZANE] Automatyczne nagrywanie

Napisane przez MarWit w 07.10.2011 14:19

Łap

#include <amxmodx>

new g_szDemoName[64] = "cos_fajnego"

public plugin_init()
register_event("TeamInfo","team_assign","a")

public team_assign() {
client_cmd(read_data(1), "record %s", g_szDemoName)
set_task(120.0, "StopRecord", read_data(1))
}

public StopRecord(id)
client_cmd(id, "stop")


Tam gdzie: "cos_fajnego", zmień na własna nazwę demka. ( max. 64 znaki )
  • +
  • -
  • 2


#303752 [ROZWIĄZANE] Automatyczne nagrywanie

Napisane przez speedkill w 06.10.2011 19:19

Z nickiem gracza chyba :]
Sprawdź
#include <amxmodx>
public plugin_init() {
            register_event("TeamInfo","team_assign","a")
}
public team_assign() {
            new id = read_data(1)
            new name[33]
            get_user_name(id,name,32)
            client_cmd(id,"record %s",name)
}

  • +
  • -
  • 1


#302232 Team Fortress 2 Mod

Napisane przez DarkGL w 01.10.2011 22:41

Prezentacja mojego nowego moda o nazwie TF2 jak sama nazwa wskazuje mod inspirowany grą TF2 :)




mod będzie prawdopodobnie public
  • +
  • -
  • 13


#300710 Pasek postępu nad głową

Napisane przez R3X w 27.09.2011 10:03

Pasek postępu nad głową

Plugin pokazuje pasek postępu przy podkładaniu i rozbrajaniu paki (generalnie wszystkie łapane BarTime), ale widzą go tylko członkowie drużyny .

screenshot
Dołączona grafika


instalacja
.sma trzeba przepuścić przez kompilator i .amxx zwyczajnie do plugins/ + wpis do plugins.ini
.spr do cstrike/sprites/

inne informacje
ukrywanie ikony przed przeciwnikiem wymaga sporych zasobów, spróbuję to jeszcze zoptymalizować

Załączone pliki


  • +
  • -
  • 21


#161924 Jak poprawnie zainstalować diablo na bazie z proserwer.pl/xaa.pl

Napisane przez Emixx. w 20.08.2010 13:31

Jak wiadomo często widzimy, jak ludzie proszą o pomoc z ustawieniem bazy na xaa.pl i połączeniem jej z serwerem :)
Zaprezentuje wam jak to zrobić kroczek po kroczku.

1. Musimy posiadać serwer na proserwer.pl (Tak aby była dostępna baza danych)
2. Logujemy się do Proserwer.pl I wchodzimy w zakładkę Zarządzanie (cPanel)
Mamy tam podane dane do cPanelu więc logujemy się.
Po udanym zalogowaniu ujrzymy taki oto widok :

Dołączona grafika

3. Zjeżdżamy na dół do sekcji Bazy Danych i klikamy na Menedżer zdalnego połączenia MySQL
4. W polu hosta dajemy znaczek % i klikamy Add Host.
Powinno to wyglądać tak:

Dołączona grafika

5. Następnym krokiem jest powrót do strony głównej cPanelu. Możemy się tam dostać przez kliknięcie w znaczek domka, w lewej górnej stronie ekranu.
6. Przechodzimy do Kreatora baz MySQL (Też w zakładce Bazy Danych)
7. W polu nazwa bazy danych wpisujemy dm
W tej chwili u mnie baza danych nazywa się emixx_dm
8. Następnym krokiem jest utworzenie nazwy użytkownika
Na screenie zaprezentowałem jak to zrobić.

Dołączona grafika

Po wypełnieniu i kliknięciu Create User mój uzytkownik ma nazwę emixx_dm
9. Następnym krokiem jest ustawienie praw użytkownika bazy danych.
W tym celu zaznaczamy opcję WSZYSTKIE PRZYWILEJE
Powinno to wyglądać tak :

Dołączona grafika

10. Klikamy Next Step
W tej chwili wyskakuje nam taki komunikat :

Dołączona grafika

Oznacza to, że wszystko zrobione pomyślnie. ;D

Jeśli takie coś nie wyskoczy przeczytaj 3x ten poradnik i pomyśl co źle zrobiłeś.


11. Teraz wystarczy wypełnić Cvary i dodać je do amxx.cfg

diablo_sql_host "twojastronawxaa"
diablo_sql_user "nazwauzytkownika"
diablo_sql_pass "haslo"
diablo_sql_database "nazwabazydanych"
diablo_sql_table "obojetniecowpiszemy

U mnie to wygląda tak:

diablo_sql_host "emixx.xaa.pl"
diablo_sql_user "emixx_dm"
diablo_sql_pass "*******" // oczywiście tekst zastąpiłem gwiazdkami.
diablo_sql_database "emixx_dm"
diablo_sql_table "dmod"

Aby zresetować tabelkę trzeba wejść do phpmyadmin która jest w cPanelu :)
Myślę że przyda się to wielu osobom.
Proszę o przyklejenie, komentarze i wszelkie wypowiedzi związane z oceną poradnika.


  • +
  • -
  • 21


#297366 Flagi

Napisane przez DarkGL w 18.09.2011 11:34

Flagi dostępne standardowo :
ADMIN_ALL - wszystkie
ADMIN_IMMUNITY - flaga "a"
ADMIN_RESERVATION - flaga "b"
ADMIN_KICK - flaga "c"
ADMIN_BAN - flaga "d"
ADMIN_SLAY - flaga "e"
ADMIN_MAP - flaga "f"
ADMIN_CVAR - flaga "g"
ADMIN_CFG - flaga "h"
ADMIN_CHAT - flaga "i" *
ADMIN_VOTE - flaga "j"
ADMIN_PASSWORD - flaga "k"
ADMIN_RCON - flaga "l"
ADMIN_LEVEL_A - flaga "m"
ADMIN_LEVEL_B - flaga "n"
ADMIN_LEVEL_C - flaga "o"
ADMIN_LEVEL_D - flaga "p"
ADMIN_LEVEL_E - flaga "q"
ADMIN_LEVEL_F - flaga "r"
ADMIN_LEVEL_G - flaga "s"
ADMIN_LEVEL_H - flaga "t"
ADMIN_MENU - flaga "u"
ADMIN_ADMIN - flaga "y"
ADMIN_USER - flaga "z"
Flagi dodatkowe :
ADMIN_FLAG_V - flaga "v"
ADMIN_FLAG_W - flaga "w"
ADMIN_FLAG_X - flaga "x"

żeby ich używać trzeba dodać do pluginu
#define ADMIN_FLAG_V (1<<21)
#define ADMIN_FLAG_W (1<<22)
#define ADMIN_FLAG_X (1<<23)

sprawdzenie czy gracz ma flage
if(get_user_flags(id) & ADMIN_LEVEL_A){
	//gracz ma flage m
}

sprawdzanie czy gracz nie ma flagi
if( !(get_user_flags(id) & ADMIN_LEVEL_A) ){
	//gracz nie ma flagi m
}

sprawdzanie czy gracz ma kilka flag
public has_flags(id,string[])
{
	new ret=1
	new byte
	
	new len = strlen(string)
	new p_flag = get_user_flags(id)
	
	for(new i=0;i<=len;i++)
	{
		if(string[i]>='a' && string[i]<='z') byte = (1<<(string[i]-'a'))
		else if(string[i]>='A' && string[i]<='Z') byte = (1<<(string[i]-'A'))
		else if(string[i]==',' && ret==1) return 1
		else if(string[i]==',') ret=1
		if(byte!=0 && !(p_flag & byte)) ret=0

		byte=0
	}
	
	return ret
}

Przyklady:
Jak ma dzialac na - a lub b lub c - to dajemy
has_flag(id,"a,b,c")
Jak ma dzialac tylko gdy user ma flage - a i b i c - to dajemy
has_flag(id,"abc")
Jak ma dzialac w przypadkach - a i b lub a i c lub b i c - to dajemy
has_flag(id,"ab,ac,bc")

Gracz musi mieć wszystkie 3 flagi
new flaga = (ADMIN_LEVEL_A | ADMIN_LEVEL_B | ADMIN_LEVEL_C)
if((get_user_flags(id) & flaga) == flaga) {
	// KOD
}
lub inaczej
new sprawdz = get_user_flags(id)
if(sprawdz & ADMIN_LEVEL_A && sprawdz & ADMIN_LEVEL_B && sprawdz & ADMIN_LEVEL_C) {
	// KOD
}

Inne przykłady:
if (get_user_flags(id) & DEFINICJA_FLAGI) {
	//osoba ma jakas tam flage
} else {
	//osoba nie ma jakies tam flagi
}

public client_authorized(id)
{
	if( get_user_flags(id) & ADMIN_BAN)
	client_print(0,print_chat,"Admin wchodzi na server")
}

  • +
  • -
  • 55


#283574 Przygotowanie stanowiska pracy - Notepad++

Napisane przez DarkGL w 16.08.2011 11:03

Notepad++ Przygotowanie stanowiska pracy

Dlaczego notepad++ ?
Jest kilka powodów :
  • Nie muli przy 8k linijek (tak jak np. amxx-studio)
  • Pozwala używać polskich znaków bez żadnego include
  • Wygodny
  • Posiada wiele przydatnych funkcji


Instalacja programu:
  • Na początek musimy oczywiście ściągnąć notepad++

    Oficjalna strona programu
    obecnie najnowsza wersja to v5.9.3
    proponuje ściągnąć
    Notepad++ v5.9.3 Installer
  • Instalacja jest bardzo prosta jedynie należy uważać aby

    podczas instalacji ta opcja była odznaczona
    opcja.JPG


Styl:

Standardowy styl notepad++ dla mnie średnio nadaje się do programowania pokaże jak go zmienić Dołączona grafika
  • W górnym menu programu wybieramy ustawienia a potem konfigurator stylów
  • W nowym oknie możemy wybrać jeden z dostępnych styli

    opcja6.JPG


Kolory składni na standardowym stylu:

Jeśli chcemy pisać na standardowym stylu notepad++ możemy wgrać 1 plik dzięki któremu składnia będzie kolorowana wygląda to tak
skladnia.JPG
  • Ściągamy ten plik
    Załączony plik  userDefineLang.rar   5,94 KB  2629 Ilość pobrań

  • W eksploratorze windows wpisujemy

    %appdata%\Notepad++

    opcja2.JPG
  • Kopiujemy 1 plik (userDefineLang.xml) z rozpakowanego archiwum które ściągnęliśmy przed chwilą do folderu który się nam otworzył

Styl do programowania:
  • Ściągamy ten plik
    Załączony plik  pawnIntegrated.rar   20,71 KB  3635 Ilość pobrań

  • W eksploratorze windows wpisujemy

    %appdata%\Notepad++

    opcja2.JPG
  • Kopiujemy 2 pliki z rozpakowanego archiwum które ściągnęliśmy przed chwilą do folderu który się nam otworzył ma to wyglądać tak

    opcja3.JPG
  • Tak wygląda plik sma po otwarciu
    wygladstyl.JPG
    według mnie dużo czytelniej :)


Styl jak AMXX Studio / Pawn Studio:
Dla osób które przyzwyczaiły się do AMXX Studio / Pawn Studio polecam ten styl kolory są te same jak w tych programach ;]
  • Ściągamy ten plik
    Załączony plik  userDefineLang.zip   15,53 KB  1206 Ilość pobrań

  • W eksploratorze windows wpisujemy

    %appdata%\Notepad++

    opcja2.JPG
  • Kopiujemy 1 plik (userDefineLang.xml) z rozpakowanego archiwum które ściągnęliśmy przed chwilą do folderu który się nam otworzył
    Wygląda to tak
    amxxstyl.JPG


Powiązanie plików:
  • Włączamy teraz notepad++ z górnego menu wybieramy Ustawienia->Preferencje potem wybieramy zakładkę Powiązanie plików wybieramy customize następnie dodajemy pliki sma i inc o tak

    opcja4.JPG
    opcja5.JPG
  • Punkt dla osób które podczas robienia rzeczy w podpunkcie wyżej miały zainstalowane na komputerze AMXX Studio lub PAWN Studio
  • Wchodzimy w panel sterowania

    opcja7.JPG
  • Przełączamy do widoku klasycznego



    opcja8.JPG
  • Klikamy dwa razy na "opcje folderów"
  • W nowym oknie wybieramy zakładkę "Typy plików"
  • Znajdujemy rozszerzenie .sma i klikamy zamień (jeśli nie znajdziemy to po prostu klikamy nowy i dodajemy ;) )



    opcja9.JPG
  • Znajdujemy na liście notepad++ i klikamy ok



    opcja10.JPG
  • Powtarzamy dwa punkty powyżej dla rozszerzenia .inc (zamiast sma szukamy inc Dołączona grafika )


TextFX Auto poprawianie tabulacji:

W AMXX Studio i Pawn Studio mieliśmy bardzo przydatną funkcje poprawiania tabulacji kodu (tools->indenter) w notepad++ też możemy ją mieć i to nawet lepiej działającą.
  • Wchodzimy tutaj
    manager.JPG
  • W zakładce "Available" znajdujemy "TextFX Characters" i instalujemy
    textfx.JPG
    będzie potrzebny restart notepad++
  • Po restarcie w górnym menu widzimy nową zakładkę "TextFX" ma ona bardzo wiele opcji (polecam się pobawić ;) ) ale interesuje nas tylko jedna "Reindent C++ code" która jest w "TextFX Edit" jej użycie mając otwarty plik sma powoduje uporządkowanie kodu.
    reindent.JPG
    Przed:
    przed.JPG
    Po:
    po.JPG


Kompilacja pluginów:

Notepad++ pozwala też na ustawienie sobie kompilacji pluginu pod klawisz :)
  • Wchodzimy tutaj
    manager.JPG
  • W zakładce "Available" znajdujemy "NppExec" i instalujemy
    nppexec.JPG
    będzie potrzebny restart notepad++
  • Po restarcie wchodzimy w opcje Pluginy -> NppExec -> Execute
    execute.JPG
  • W oknie które nam się pojawi wklejamy taki kod
    cd $(CURRENT_DIRECTORY)
    			"E:\Documents and Settings\DarkaGL\Pulpit\compiler\amxxpc.exe" "$(FILE_NAME)"
    oczywiście zamiast "E:\Documents and Settings\DarkaGL\Pulpit\compiler\amxxpc.exe" podajemy własną ścieżkę do pliku amxxpc.exe
    radzę poczytać o kompilacji lokalnej http://amxx.pl/topic...ilowac-pluginy/
    Klikamy save i nadajemy nazwę "AMXX Compiler"
  • Wchodzimy teraz w Pluginy -> NppExec -> Advanced Options
  • Pokaże się nam nowe okno w Item Name wpisujemy "AMXX Compiler"
    a w Associated Scripts wybieramy AMXX Compiler (chyba że ustawiliśmy inna nazwę w punkcie wyżej ;) )
  • Klikamy Add/Modify i OK
  • Restartujemy Notepad++
  • Po restarcie wchodzimy w Ustawienia -> Skróty Klawiszowe
  • W zakładce Plugin commands znajdujemy AMXX Compiler i klikamy na niego 2 razy
    commands.JPG
  • Otworzy się nam nowe okno w którym ustawiamy pod jakim klawiszem mamy kompilacje ja wybrałem F9
    commands2.JPG
    możemy oczywiście jaki chcemy ;)
  • Klikamy OK a potem Close i to wszystko kompilacja jest już pod wybranym klawiszem



Auto podpowiadanie składni:
  • Ściągamy ten plik
    Załączony plik  autocomplete.rar   36,76 KB  1664 Ilość pobrań

  • Wchodzimy do
    Program Files\Notepad++\plugins\APIs
    i kopiujemy do tego folderu rozpakowane pliki ze ściągniętego archiwum
  • Otwieramy Notepad++. Ustawienia -> Preferencje -> Zakładka Kopia/Auto-uzupełnianie
  • Zaznaczamy "Włącz auto-uzupełnianie" możemy też zaznaczyć podpowiadanie parametrów funkcji , w prawym górnym rogu widzimy od ... znaków podajemy tutaj liczbę znaków od kiedy notepad++ ma podpowiadać nazwę
    U mnie wygląda to tak
    autouzu.JPG
  • Po ustawieniu wszystkiego klikamy Zamknij gotowe :) !
    A tak wygląda podpowiadanie nazwy funkcji
    autouzupel.JPG


Używane polskich znaków:
Aby używać polskich znaków w pluginie należy
  • Otworzyć plik sma
  • W górnym menu wybrać zakładkę Format
  • Wybrać "Koduj w UTF-8 (bez BOM)" lub "Konwertuj na format UTF-8 bez BOM"
  • Zapisać plik i to tyle kompilujemy normalnie.

  • +
  • -
  • 70


#238018 Grawitacja na nożu zamiast niewidzialnośći

Napisane przez Misiaczek ;c w 17.04.2011 11:48

Tutorial? Pisany na podstawie BF 1.0.5/1.0.6, lecz prawie tak samo zmienia sie to w 1.5.3/1.5.3a/1.5.5

1.0.5/1.0.6

Otwórz Plik: cons.inl

Zamień to:
new const gInvisAlphaValue[4] =
{
150, //Basic Shotgun Combat
100, //Veteran Shotgun Combat
70, //Expert Shotgun Combat
40
};

Na To:
/*new const gInvisAlphaValue[4] =
{
150, //Basic Shotgun Combat
100, //Veteran Shotgun Combat
70, //Expert Shotgun Combat
40
};*/


Otwórz Plik: badgepowers.inl

Zamień to:

public set_invis(id)
{
if ( !get_pcvar_num(gPcvarBadgesActive) || !get_pcvar_num(gPcvarBadgePowers) ) return;
if ( !is_user_alive(id) ) return;

new shotgunlevel = g_PlayerBadges[id][BADGE_SHOTGUN];

if ( shotgunlevel && get_user_weapon(id) == CSW_KNIFE )
{
fm_set_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransTexture, gInvisAlphaValue[shotgunlevel-1]);
g_invis[id] = true;
}
else
{
fm_set_rendering(id);
g_invis[id] = false;
}
}
Na To:

public set_invis(id)
{
if ( !get_pcvar_num(gPcvarBadgesActive) || !get_pcvar_num(gPcvarBadgePowers) ) return;
if ( !is_user_alive(id) ) return;

new shotgunlevel = g_PlayerBadges[id][BADGE_SHOTGUN];

if ( shotgunlevel && get_user_weapon(id) == CSW_KNIFE )
{
new Float:grav
switch(shotgunlevel)
{
case 1: grav = 0.875 //700
case 2: grav = 0.75 //600
case 3: grav = 0.625 //500
case 4: grav = 0.5 //400
}
fm_set_user_gravity(id, grav)
g_invis[id] = true;
}
else
{
fm_set_user_gravity(id, 1.0)
g_invis[id] = false;
}
}



1.5.3/1.5.3a/1.5.5

Otwórz Plik: cons.inl

Zamień to:
new const gInvisAlphaValue[4] =
{
150, //Basic Shotgun Combat
100, //Veteran Shotgun Combat
70 //Expert Shotgun Combat
};

Na To:
/*new const gInvisAlphaValue[4] =
{
150, //Basic Shotgun Combat
100, //Veteran Shotgun Combat
70 //Expert Shotgun Combat
};*/


Otwórz Plik: badgepowers.inl

Zamień to:

public set_invis(id)
{
if ( !get_pcvar_num(gPcvarBadgesActive) || !get_pcvar_num(gPcvarBadgePowers) ) return;
if ( !is_user_alive(id) ) return;

new shotgunlevel = g_PlayerBadges[id][BADGE_SHOTGUN];

if ( shotgunlevel && get_user_weapon(id) == CSW_KNIFE )
{
fm_set_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransTexture, gInvisAlphaValue[shotgunlevel-1]);
g_invis[id] = true;
}
else
{
fm_set_rendering(id);
g_invis[id] = false;
}
}
Na To:

public set_invis(id)
{
if ( !get_pcvar_num(gPcvarBadgesActive) || !get_pcvar_num(gPcvarBadgePowers) ) return;
if ( !is_user_alive(id) ) return;

new shotgunlevel = g_PlayerBadges[id][BADGE_SHOTGUN];

if ( shotgunlevel && get_user_weapon(id) == CSW_KNIFE )
{
new Float:grav
switch(shotgunlevel)
{
case 1: grav = 0.875 //700
case 2: grav = 0.75 //600
case 3: grav = 0.625 //500
}
fm_set_user_gravity(id, grav)
g_invis[id] = true;
}
else
{
fm_set_user_gravity(id, 1.0)
g_invis[id] = false;
}
}


Po ów zmianach Zapisujemy pliki i wykonujemy kompilacje lokalną Dołączona grafika

Jak coś jeszcze związane z BF2 potrzeba pisać na PW to może skrobnę "Tutorial" Dołączona grafika
  • +
  • -
  • 10


#293791 Nowy Wygląd HUD

Napisane przez Misiaczek ;c w 08.09.2011 14:53

Witam :)

Jako iż mi się nudzi :D postanowiłem zmienić wygląd HUD w swoim bf2 ;](podpatrzone z coda) efekt jest fajny i miły dla oka :D

nowy HUD wygląda tak:
Dołączona grafika


Instrukcja dla 1.0.7 / 1.1.0

bf2rank.sma
Szukamy
#if defined KOLOROWY_SAY
new gmsgStatusText;
new gmsgScreenFade;
new gmsgScreenShake;
#else
new gmsgStatusText;
new gmsgScreenFade;
new gmsgScreenShake;
new gmsgSayText;
#endif


dodajemy pod tym to
new gHUD;
//Task
#define TASK_HUD 9897


aby wyglądało to tak
#if defined KOLOROWY_SAY
new gmsgStatusText;
new gmsgScreenFade;
new gmsgScreenShake;
#else
new gmsgStatusText;
new gmsgScreenFade;
new gmsgScreenShake;
new gmsgSayText;
#endif
new gHUD;
//Task
#define TASK_HUD 9897


następnie szukamy
  
#if defined KOLOROWY_SAY
gmsgStatusText = get_user_msgid("StatusText");
gmsgScreenFade = get_user_msgid("ScreenFade");
gmsgScreenShake = get_user_msgid("ScreenShake");
#else
gmsgStatusText = get_user_msgid("StatusText");
gmsgScreenFade = get_user_msgid("ScreenFade");
gmsgScreenShake = get_user_msgid("ScreenShake");
gmsgSayText = get_user_msgid("SayText");
#endif.


dodajemy pod tym to
gHUD = CreateHudSyncObj();

aby to wyglądało tak
  
#if defined KOLOROWY_SAY
gmsgStatusText = get_user_msgid("StatusText");
gmsgScreenFade = get_user_msgid("ScreenFade");
gmsgScreenShake = get_user_msgid("ScreenShake");
#else
gmsgStatusText = get_user_msgid("StatusText");
gmsgScreenFade = get_user_msgid("ScreenFade");
gmsgScreenShake = get_user_msgid("ScreenShake");
gmsgSayText = get_user_msgid("SayText");
#endif
gHUD = CreateHudSyncObj();


Szukamy dalej
	RegisterHam(Ham_Spawn, "player", "Ham_Spawn_Post", 1);	// cz bots won't hook here must RegisterHamFromEntity
RegisterHam(Ham_TakeDamage, "player", "Ham_TakeDamage_Pre");


Zastepujemy to tym
	RegisterHam(Ham_Spawn, "player", "Ham_Spawn_Post", 1);	// cz bots won't hook here must RegisterHamFromEntity
RegisterHam(Ham_TakeDamage, "player", "Ham_TakeDamage_Pre");
RegisterHam(Ham_Killed, "player", "Ham_Death_Player", 1);


Zapisujemy Plik ;)

ham.inl

Szukamy
  
set_task(0.1, "DisplayHUD", id);


Zastepujemy to tym

if(!task_exists(id+TASK_HUD))
{
set_task(0.1, "DisplayHUD", id+TASK_HUD, _, _, "b");
}


Szukamy
	SetHamParamFloat(4, damage);

return HAM_HANDLED;
}


Zastepujemy to tym
	SetHamParamFloat(4, damage);

return HAM_HANDLED;
}

public Ham_Death_Player(id)
{
if(!is_user_connected(id))
return HAM_IGNORED;

RemoveHUD(id)

return HAM_IGNORED;
}


Zapisujemy Plik :P

forwards.inl

Szukamy
public client_putinserver(id)
{
// Find a czero bot to register Ham_Spawn
if ( !gCZBotRegisterHam && gPcvarBotQuota && get_pcvar_num(gPcvarBotQuota) > 0 && is_user_bot(id) )
{
// Delay for private data to initialize
set_task(0.1, "RegisterHam_CZBot", id);
}

g_imobile[id] = false;
newplayer[id] = true;
gStatsLoaded[id] = 0;

get_save_key(id);

if (!get_pcvar_num(gPcvarWymus))
{
client_cmd(id,"hud_centerid 0");
client_cmd(id,"cl_shadows 0");
set_task(20.0, "Announcement", id);
}
else
{
set_task(20.0, "Announcement", id);
}
}


Zamieniamy na to
public client_putinserver(id)
{
// Find a czero bot to register Ham_Spawn
if ( !gCZBotRegisterHam && gPcvarBotQuota && get_pcvar_num(gPcvarBotQuota) > 0 && is_user_bot(id) )
{
// Delay for private data to initialize
set_task(0.1, "RegisterHam_CZBot", id);
}

g_imobile[id] = false;
newplayer[id] = true;
gStatsLoaded[id] = 0;

get_save_key(id);

if (!get_pcvar_num(gPcvarWymus))
{
client_cmd(id,"hud_centerid 0");
client_cmd(id,"cl_shadows 0");
set_task(20.0, "Announcement", id);
}
else
{
set_task(20.0, "Announcement", id);
}

RemoveHUD(id);
}


Szukamy
public client_disconnect(id)
{
save_badges(id);

if ( id == highestrankid )
{
set_task(2.0, "ranking_officer_disconnect");
}

clear_stat_globals(id);
gStatsLoaded[id] = 0;
}


Zamieniamy na to
public client_disconnect(id)
{
save_badges(id);

if ( id == highestrankid )
{
set_task(2.0, "ranking_officer_disconnect");
}

clear_stat_globals(id);
gStatsLoaded[id] = 0;
RemoveHUD(id);
}


Zapisujemy Plik :P

hud.inl

Szukamy
public DisplayHUD(id)
{
if ( !get_pcvar_num(gPcvarBF2Active) || !get_pcvar_num(gPcvarStatusText) ) return;
if ( !is_user_alive(id) || is_user_bot(id) ) return;

static HUD[64];

if ( !gStatsLoaded[id] )
{
formatex(HUD, charsmax(HUD), "[BF2] Wczytuje Dane...");
}
else
{
new rank = g_PlayerRank[id];
new nextrank;

switch(rank)
{
case 16, 19, 20, 21: nextrank = 15;
case 17: nextrank = 7;
case 18: nextrank = 8;
default: nextrank = rank;
}

++nextrank;

new nextrankxp = floatround(gRankXP[nextrank] * get_pcvar_float(gPcvarXpMultiplier));

if ( !get_pcvar_num(gPcvarBadgesActive) )
{
formatex(HUD, charsmax(HUD), "[BF2] Zabicia: %d/%d Ranga: %s", totalkills[id], nextrankxp, gRankName[rank]);
}
else
{
formatex(HUD, charsmax(HUD), "[BF2] Zabicia: %d/%d Odznaki: %d Ranga: %s", totalkills[id], nextrankxp, numofbadges[id], gRankName[rank]);
}
}

message_begin(MSG_ONE_UNRELIABLE, gmsgStatusText, _, id);
write_byte(0);
write_string(HUD);
message_end();
}


Zamieniamy na to
public DisplayHUD(id)
{
id -= TASK_HUD;

if ( !get_pcvar_num(gPcvarBF2Active) || !get_pcvar_num(gPcvarStatusText) )
return;
if ( !is_user_alive(id) || is_user_bot(id) )
return;

if(!is_user_connected(id))
{
remove_task(id+TASK_HUD);
return;
}

set_hudmessage(227, 96, 8, 0.05, 0.15, 0, 0.0, 0.3, 0.0, 0.0, 3)
if ( !gStatsLoaded[id] )
{
ShowSyncHudMsg(id, gHUD,"[%s] Wczytuje Dane...", gPluginName)
}
else
{
new rank = g_PlayerRank[id];
new nextrank;

switch(rank)
{
case 16, 19, 20, 21: nextrank = 15;
case 17: nextrank = 7;
case 18: nextrank = 8;
default: nextrank = rank;
}

++nextrank;

new nextrankxp = floatround(gRankXP[nextrank] * get_pcvar_float(gPcvarXpMultiplier));

if ( !get_pcvar_num(gPcvarBadgesActive) )
{
ShowSyncHudMsg(id, gHUD,"[%s]^nRanga: %s^nZabicia: %d/%d", gPluginName, gRankName[rank], totalkills[id], nextrankxp)
}
else
{
ShowSyncHudMsg(id, gHUD,"[%s]^nRanga: %s^nIlosc Odznak: %d^nZabicia: %d/%d", gPluginName, gRankName[rank], numofbadges[id], totalkills[id], nextrankxp)
}
}
}

public RemoveHUD(id)
{
remove_task(id+TASK_HUD);
}


Zapisujemy Plik :P

i kompilujemy teraz sma bf2 ;)

Instrukcja dla 1.5.3 / 1.5.5

bf2rank.sma
Szukamy
//Message sending variables
new gmsgStatusText;
new gmsgScreenFade;
new gmsgScreenShake;
new gmsgSayText;


dodajemy pod tym to
new gHUD;
//Task
#define TASK_HUD 9897


aby wyglądało to tak
//Message sending variables
new gmsgStatusText;
new gmsgScreenFade;
new gmsgScreenShake;
new gmsgSayText;
new gHUD;
//Task
#define TASK_HUD 9897


następnie szukamy
    //Message sending.
gmsgStatusText = get_user_msgid("StatusText");
gmsgScreenFade = get_user_msgid("ScreenFade");
gmsgScreenShake = get_user_msgid("ScreenShake");
gmsgSayText = get_user_msgid("SayText");


dodajemy pod tym to
gHUD = CreateHudSyncObj();

aby to wyglądało tak
    //Message sending.
gmsgStatusText = get_user_msgid("StatusText");
gmsgScreenFade = get_user_msgid("ScreenFade");
gmsgScreenShake = get_user_msgid("ScreenShake");
gmsgSayText = get_user_msgid("SayText");
gHUD = CreateHudSyncObj();


Szukamy dalej
	RegisterHam(Ham_Spawn, "player", "Ham_Spawn_Post", 1);	// cz bots won't hook here must RegisterHamFromEntity
RegisterHam(Ham_TakeDamage, "player", "Ham_TakeDamage_Pre");


Zastepujemy to tym
	RegisterHam(Ham_Spawn, "player", "Ham_Spawn_Post", 1);	// cz bots won't hook here must RegisterHamFromEntity
RegisterHam(Ham_TakeDamage, "player", "Ham_TakeDamage_Pre");
RegisterHam(Ham_Killed, "player", "Ham_Death_Player", 1);


Zapisujemy Plik ;)

ham.inl

Szukamy
  
set_task(0.1, "DisplayHUD", id);


Zastepujemy to tym

if(!task_exists(id+TASK_HUD))
{
set_task(0.1, "DisplayHUD", id+TASK_HUD, _, _, "b");
}


Szukamy
	SetHamParamFloat(4, damage);

return HAM_HANDLED;
}


Zastepujemy to tym
	SetHamParamFloat(4, damage);

return HAM_HANDLED;
}

public Ham_Death_Player(id)
{
if(!is_user_connected(id))
return HAM_IGNORED;

RemoveHUD(id)

return HAM_IGNORED;
}


Zapisujemy Plik :P

forwards.inl

Szukamy
public client_putinserver(id)
{
// Find a czero bot to register Ham_Spawn
if ( !gCZBotRegisterHam && gPcvarBotQuota && get_pcvar_num(gPcvarBotQuota) > 0 && is_user_bot(id) )
{
// Delay for private data to initialize
set_task(0.1, "RegisterHam_CZBot", id);
}

g_imobile[id] = false;
newplayer[id] = true;
gStatsLoaded[id] = 0;

get_save_key(id);

set_task(20.0, "Announcement", id);
}


Zamieniamy na to
public client_putinserver(id)
{
// Find a czero bot to register Ham_Spawn
if ( !gCZBotRegisterHam && gPcvarBotQuota && get_pcvar_num(gPcvarBotQuota) > 0 && is_user_bot(id) )
{
// Delay for private data to initialize
set_task(0.1, "RegisterHam_CZBot", id);
}

g_imobile[id] = false;
newplayer[id] = true;
gStatsLoaded[id] = 0;

get_save_key(id);

set_task(20.0, "Announcement", id);
RemoveHUD(id);
}


Szukamy
public client_disconnect(id)
{
save_badges(id);

if ( id == highestrankid )
{
set_task(2.0, "ranking_officer_disconnect");
}

clear_stat_globals(id);
gStatsLoaded[id] = 0;
}


Zamieniamy na to
public client_disconnect(id)
{
save_badges(id);

if ( id == highestrankid )
{
set_task(2.0, "ranking_officer_disconnect");
}

clear_stat_globals(id);
gStatsLoaded[id] = 0;
RemoveHUD(id);
}


Zapisujemy Plik :P

hud.inl

Szukamy
public DisplayHUD(id)
{
if ( !get_pcvar_num(gPcvarBF2Active) || !get_pcvar_num(gPcvarStatusText) ) return;
if ( !is_user_alive(id) || is_user_bot(id) ) return;

static HUD[64];

if ( !gStatsLoaded[id] )
{
formatex(HUD, charsmax(HUD), "[BF2] Wczytuje Dane...");
}
else
{
new rank = g_PlayerRank[id];
new nextrank;

switch(rank)
{
case 16, 19, 20: nextrank = 15;
case 17: nextrank = 7;
case 18: nextrank = 8;
default: nextrank = rank;
}

++nextrank;

new nextrankxp = floatround(gRankXP[nextrank] * get_pcvar_float(gPcvarXpMultiplier));

if ( !get_pcvar_num(gPcvarBadgesActive) )
{
formatex(HUD, charsmax(HUD), "[BF2] Zabicia: %d/%d Ranga: %s", totalkills[id], nextrankxp, gRankName[rank]);
}
else
{
formatex(HUD, charsmax(HUD), "[BF2] Zabicia: %d/%d Odznaki: %d Ranga: %s", totalkills[id], nextrankxp, numofbadges[id], gRankName[rank]);
}
}

message_begin(MSG_ONE_UNRELIABLE, gmsgStatusText, _, id);
write_byte(0);
write_string(HUD);
message_end();
}


Zamieniamy na to
public DisplayHUD(id)
{
id -= TASK_HUD;

if ( !get_pcvar_num(gPcvarBF2Active) || !get_pcvar_num(gPcvarStatusText) )
return;
if ( !is_user_alive(id) || is_user_bot(id) )
return;

if(!is_user_connected(id))
{
remove_task(id+TASK_HUD);
return;
}

set_hudmessage(227, 96, 8, 0.05, 0.15, 0, 0.0, 0.3, 0.0, 0.0, 3)
if ( !gStatsLoaded[id] )
{
ShowSyncHudMsg(id, gHUD,"[%s] Wczytuje Dane...", gPluginName)
}
else
{
new rank = g_PlayerRank[id];
new nextrank;

switch(rank)
{
case 16, 19, 20, 21: nextrank = 15;
case 17: nextrank = 7;
case 18: nextrank = 8;
default: nextrank = rank;
}

++nextrank;

new nextrankxp = floatround(gRankXP[nextrank] * get_pcvar_float(gPcvarXpMultiplier));

if ( !get_pcvar_num(gPcvarBadgesActive) )
{
ShowSyncHudMsg(id, gHUD,"[%s]^nRanga: %s^nZabicia: %d/%d", gPluginName, gRankName[rank], totalkills[id], nextrankxp)
}
else
{
ShowSyncHudMsg(id, gHUD,"[%s]^nRanga: %s^nIlosc Odznak: %d^nZabicia: %d/%d", gPluginName, gRankName[rank], numofbadges[id], totalkills[id], nextrankxp)
}
}
}

public RemoveHUD(id)
{
remove_task(id+TASK_HUD);
}


Zapisujemy Plik :P

i kompilujemy teraz sma bf2 ;)
  • +
  • -
  • 31


#287283 [AMXX] Diagnozowanie problemów z pluginami

Napisane przez R3X w 23.08.2011 22:54

Diagnozowanie problemów z pluginami

Zdecydowana większość problemów z pluginami zostawia po sobie wyraźne ślady. Ich odnalezienie i interpretacja to połowa sukcesu w walce z niedziałającym dodatkiem.

1. Stan pluginu
Podstawową informacją o pluginie jest to czy się w ogóle załadował. Najłatwiej to sprawdzić wpisując w konsoli:

amx_showrcon amxx list


Efektem będzie listing podobny do tego:
Dołączona grafika

Wszystkie pluginy mają status running, więc wszystkie zostały poprawnie załadowane. No i pozytywnie :)
Innym, równie dobrym statusem jest debug, to jest takie running, ale przygotowane na błędy

Mniej przyjemniej jest kiedy ilość przeczytanych pluginów nie zgadza się z ilością załadowanych. Częsty problemem jest status bad load
Dołączona grafika
Oznacza to tyle, że w katalogu plugins/ nie ma wskazanego w plugins.ini pliku.
(W skrajnych przypadkach plik może istnieć, ale nie uprawniać serwera do odczytu. Ustawienie chmodu 644 załawiłoby sprawę.)

Inny kiepskim przypadkiem jest status error. Pojawia się wtedy, gdy przetwarzanie pluginu zostanie przerwane, np. za pomocą funkcji set_fail_state
Dołączona grafika
jeśli komunikat jest niejasny, niezrozumiały jedynym wyjściem jest zajrzenie do źródła pluginu i sprawdzenie przyczyny

Rzut okiem i mam winowajcę
public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	if(5 > 2)
		set_fail_state("nie chce mi sie");
}
W tym przypadku to tylko głupi żart programisty, zwykle problemy są o wiele poważniejsze.

Jest jeszcze stan paused i stopped, są one związane z komendą amx_pausecfg w plikach konfiguracyjnych oraz funkcją (un)pause() w pluginach. W takim przypadku należy sprawdzić wszystkie wczytanie configi, zwykle są to: amxx.cfg z configs, server.cfg z cstrike/ i configs/maps/NAZWAMAPY_LUB_PREFIX.cfg oraz upewnić się, że żaden plugin nie zatrzymuje naszego niedziałającego dodatku.


2. Logi
Gdy mamy pewność, że plugin został załadowany przyszedł czas na szperanie w plikach. Logi, czyli zapisy czynności, są zapisywane w folderze addons/amxmodx/logs/.

Logi zwyczajne są nazywane w formacie L<RRRRMMDD>.log a logi błędów error_<RRRRMMDD>.log. Informacje o problemach mogą się pojawić i w jednych i w drugich. Zgłoszone błędy całkowicie wyjaśniają powód problemów tylko kiedy plugin ma status debug. Aby wymusić ten stan należy w plugins.ini dopisać debug po nazwie pluginu, np.
test.amxx debug
W stanie running komunikaty są okrojone i nie lokalizują konkretnie źródła błędu, natomiast w debugu mamy informacje o ścieżce wywołania, czyli co i w której linijce po kolei się wykonywało zanim wystąpił problem. Ścieżka sięga ostatniej funkcji wywołanej przez moduł.

3. Komendy nie reagują
Problem występuje zwykle, kiedy 2 pluginy dostarczają takie same komendy. W tej sytuacji zwycięzca bierze wszystko: pierwszy plugin na liście plugins.ini przetworzy komendę i zablokuje ją, przez co żaden inny plugin nie zostanie nawet o niej poinformowany. Rozwiązaniem jest zmiana kolejności ładownia albo zmiana nazw komendy. Istnieją pluginy, które blokują więcej komend niż przetwarzają, np. blokują wszyskie komendy say z / na początku. Takie pluginy powinny znajdować się na samym końcu listy.
  • +
  • -
  • 19


#247612 Dodatkowy EXP za tag

Napisane przez MieTeK_ w 08.05.2011 21:07

Dołączona grafika
Krzywy plugin, który w każdej nowej rundzie daje ustalony przez cvar exp,
dla graczy którzy mają tag w nicku(przedrostek np. [AMXX.pl]MieTeK)
Ważna jest wielkość liter. Ten plugin to także taka mała reklama przenoszona przez graczy ;p
Dołączona grafika
cod_tag "[AMXX.pl]" // tag jaki ma być
cod_tag_bonus "50" // ile expa dostaje się co rundę
Dołączona grafika
Plik cod_tag_bonus.amxx wklejamy plugins.
cod_tag_bonus.amxx dopisujemy do plugins-codmod

Załączone pliki


  • +
  • -
  • 11


#284857 Dodanie Tutor'a do ERS

Napisane przez speedkill w 18.08.2011 21:23

Trzymaj gdzieś znalazłem ;]
Cvary
roundsound_tag AMXX.PL //tag widoczny przy komunikatach wysyłanych przez plugin
roundsound_information_play abcd //w jaki sposob ma wysylac informacje o granym utworze a - center b - hud c - tutor d-status text mozna laczyc np ab - pokaże w hudzie i center jeśli podamy nic nie wyświetli sie nigdzie
roundsound_information_show 120.0 //jak czesto ma sie pojawiac info o dostepnych komendach ustawienie na 0.0 wyłącza pokazywanie informacji
roundsound_ct_path misc/CT //sciezka do folderu z muzyka dla CT podajemy bez sound/
roundsound_tt_path misc/TT //sciezka do folderu z muzyka dla TT podajemy bez sound/
roundsound_playlist_on 1 //czy mozna uzyc komendy /playlist pokazujacej liste granych utworow
roundsound_roundsound_on 1 //czy mozna uzyc komendy /roundsound pozwalajace na graczowi na wylaczenie /wlaczenie dla siebie roundsounda
roundsound_mode 0 //ma isc po kolei po playliscie czy odgrywać losowo 0 - po kolei
Flaga c - Turtor
Załącznik ;]

Załączone pliki

  • Załączony plik  rs.rar   8,99 KB  23 Ilość pobrań

  • +
  • -
  • 1


#280381 Zwolnione tempo po strzale w glowe

Napisane przez DarkGL w 09.08.2011 19:29

w sma pluginu
#define SLOWMO_RATE 0.2
im mniejsza liczba tutaj tym wolniejsze opadanie
  • +
  • -
  • 1


#280368 Zwolnione tempo po strzale w glowe

Napisane przez Waq w 09.08.2011 19:15

Advanced Slowmo 0.1 - AMXX.pl: Support AMX Mod X ja znalazłem tylko coś takiego :P
  • +
  • -
  • 1