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
 

Owner123 - zdjęcie

Owner123

Rejestracja: 12.10.2009
Aktualnie: Nieaktywny
Poza forum Ostatnio: 18.12.2011 18:32
*----

#230199 Challenge - wyzwania i nagrody

Napisane przez R3X w 26.03.2011 14:57

Challenge
v.0.6.1
Z powodu sposobu konfiguracji przeznaczony jest dla osób obeznanych z pisaniem własnych pluginów.
Zainteresowanych zapraszam do tematu: [Challenge] Gotowce i przykłady - AMXX.pl: Support AMX Mod X

Pomysłem zarzucił: Skull3D - Przeglądanie profilu - AMXX.pl: Support AMX Mod X

Dołączona grafika

Platforma do tworzenia wyzwań i nagradzania za ich spełniania. Używa bazy danych do gromadzenia statystyk graczy dla konkretnych broni i tylko tych, które wybierzemy. Oprócz tego sumuje czas spędzony na serwerze oraz zapisuje datę pierwszego połączenia, dzięki temu możemy wykryć kto gra długo / od dawna i też przypisać takim graczom jakiś bonus.

Można udostępnić graczom listę wyzwań:
Dołączona grafika

Przewidziałem 3 przypadki zapisywania statystyk:
  • statystyki broni standardowych
    • czyli zabicia z kałacha czy m4, DeathMsg łapane zawsze
  • statystyki broni niestandardowych
    • czyli zabicia z magicznych przedmiotów czy skilli, DeathMsg łapane zawsze tylko z użyciem Orpheu, bez tego modułu trzeba używać Ham_TakeDamage lub emessagebegin()
  • statystyki broni własnych
    • czyli staty za cokolwiek chcemy, sami dodajemy punkty funkcją ch_add_user_stats()

Wyzwania definiujemy w osobnym pluginie. Mogą one łączyć opisane wyżej przypadki, a także uwzględniać czas gry na serwerze.

Włączenie zapisywania statystyk danej broni to wywołanie w plugin_init()

challenge_uses_stats(wid);
np.
challenge_uses_stats(CSW_KNIFE);

oznacza, że plugin będzie zbierał informację o zabiciach z noża.

Pobranie zgromadzonych statystyk gracza umożliwia funkcja

ch_get_user_stats(id, wid, hs=0);

Od wersji 0.2 możemy dodawać własne pola statystyk, nie koniecznie związane z zabijaniem. Wśród przykładów dałem opcję zapisywania ilości rozbrojonych i podłożonych bomb (folder custom/).

Ważne
Skompilowanie z dołączeniem orpheu spowoduje łapanie wszystkich informacji o zabójstwach, bez nich zapisywane są tylko te wyrządzone Ham_TakeDamage lub z użyciem emessagebegin()
Sygnatury funkcji zapożyczone z Funkcja you] Advanced - AMXX.pl: Support AMX Mod X

Dołączona grafika
Standardowa


Opcje kompilacji

wersja 0.5 i starsze

Odkomentuj
//#define USING_ORPHEU
jeśli chcesz użyć modułu Orpheu (http://forums.allied...ad.php?t=103855)


Odkomentuj
//#define USING_DHUD
jeśli chcesz użyć efektów Dynamiczny HUD - AMXX.pl: Support AMX Mod X

Wygląda to mniej więcej tak: YouTube - Challenge DHUD.wmv

od 0.5.1
dostępne są 2 cvary: amx_challenge_useorpheu i amx_challenge_usedhud
aby użyć orpheu należy go zainstalować na serwerze i ustawić pierwszy cvar na 1
to samo z dhud, należy go zainstalować na serwerze i ustawić ten drugi cvar na 1

Dołączona grafika
Dane mogą być zapisywane na 2 sposóby:

SQLite (domyślnie)
  • w pliku na serwerze
  • wymaga odblokowanego modułu sqlite w modules.ini
  • plik bazy może zostać stworzony przez plugin tylko jeśli ma do tego prawo (chmod 600), możliwe, że trzeba będzie wrzuć pusty plik o podanej w cvarze nazwie na FTP

Ustawienia:
//SQLite
amx_challenge_sqltype 	"sqlite"
amx_challenge_host 	""
amx_challenge_user 	""
amx_challenge_pass 	""
amx_challenge_db 	"addons/amxmodx/data/challenge.db"
amx_challenge_prefix 	""


MySQL
  • osobny serwer bazy danych
  • wymaga odblokowanego modułu mysql w modules.ini
  • łatwiej o prezentację na stronie WWW i jest bardziej niezawodny

Ustawienia:
//MySQL
amx_challenge_sqltype 	"mysql"
amx_challenge_host 	"localhost"
amx_challenge_user 	"root"
amx_challenge_pass 	"root"
amx_challenge_db 	"challenge"
amx_challenge_prefix 	""


amx_challenge_save 1|2|3

  • typ zapisu
  • 1 - steamid
  • 2 - nick
  • 3 - ip

amx_challenge_list_available 0|1

  • włącz/wyłącz możliwość podglądu wyzwań, ustawienie na 0 blokuje komendę /challenge


amx_challenge_bots 0|1|2

  • zapisywanie statystyk botów
  • 0 - nie zapisu
  • 1 - tylko grające
  • 2 - wszystkie

amx_challenge_minplayers 0

  • wymagana ilość grających graczy na serwerze do zliczania statystyk


amx_challnege_usedhud 0

  • czy używać DHUD (jeśli dostępne)

amx_challnege_orpheu 0

  • czy używać Orpheu (jeśli dostępne)

Zmiany:

0.6.1
- poprawiona numeracja
- nowa funkcjonalność: możliwość podania koloru wiadomości
native challenge_show_custom_info(id, const szChallenge[], const szAward[], const iColor[3] = {255, 255, 255});

0.6.0
- poprawiona kolejka DHUD

0.5.2
- bugfix: plugin tworzył zbędny, kumulujący się plik temp.txt

0.5.1
- usunięty bug z motd po wyjściu z menu challenge
- nowy cvar: amx_challenge_minplayers
- nowy cvar: amx_challenge_useorpheu
- nowy cvar: amx_challenge_usedhud
- nowy natyw: challenge_get_state
- nowy natyw: ch_set_user_stats
- forward client_gain_point : można zablokować dodanie punkty zwracając PLUGIN_HANDLED

0.5
- możliwość tworzenia grup wyzwań
wystarczy je przypisać funkcją challenge_set_group() z tą samą nazwą grupy

0.4
- rozszerzone API
- nowy funkcja: client_data_loaded(id){} informuje o wczytaniu danych z bazy
- nowa funkcja: client_gain_point(id, wid, hs){} informuje o przyznaniu punktu


0.3.1
- informacje o zdobytych osiągnięciach (klient może wyłączyć je komendą /infooff)
- lista wyzwań i postęp: komenda /challenge

0.3
- współpraca z SQLite,

0.2.2
- bugfix, nie zliczało statów
- automatyczne zapisywanie niestandardowych broni do pliku

0.2.1
- wrzucało zbędne wpisy w logach, teraz już nie

0.2
- możliwa współpraca z Orpheu
- funkcja zmiany statystyk

0.1.2
- nie dodaje istniejącej już niestandardowej broni



Gotowe wyzwania:

Załączone pliki


  • +
  • -
  • 22


#252660 System heksadecymalny (szesnastkowy)

Napisane przez diablix w 24.05.2011 19:18

Jeżeli był już taki temat to proszę o usunięcie tego, jednak nigdzie tego nie znalazłem Dołączona grafika

Szesnastkowy system liczbowy (czasem nazywany heksadecymalnym, skrót hex) – pozycyjny system liczbowy, w którym podstawą jest liczba 16. Skrót hex pochodzi od angielskiej nazwy hexadecimal. Do zapisu liczb w tym systemie potrzebne jest szesnaście cyfr.

System ten znalazł zastososowanie również w pawnie, jak kompilator wykrywa że jest to system hex? Otóż po tym ze liczba się zaczyna od 0x (można sobie wmówić że x to 16 a po x jest operator mnożenia)

Jak zamienić liczbe w systemie hex na system decymalny (dziesiętny) ?

Bardzo łatwo, naprzykład :

0x14 = 16 * 1 + 4 = 20
0x10 = 16 * 1 + 0 = 16
0x25 = 16 * 2 + 5 = 37


Aby kod wyglądał ciekawiej można zastosować ten system naprzykład w

set_pev(ent, pev_effects, 0x10); // numer efektu = 16


Litery (char / znak) zamiast liczb?


Zamiast liczb możemy również użyć znaków które będą im odpowiadać
Są one w następującej kolejności (wielkość liter jest dowolna)

a = 10
b = 11
c = 12
d = 13
e = 14
f = 15

0xA = 0x10 = 16 * 0 + 10 = 10
0xC = 0x12 = 16 * 1 + 2 = 18
0xFF = 0x1515 = 16 * 15 + 15 = 255
0xAF = 0x1015 = 16 * 10 + 15 = 175

Zastosowanie przykładowe w sma

#include <amxmodx>

#define VERSION "0.1"

new const g_iHEX[] = {
0x14, //20
0x25, //37
0x15, //21
0x05, //5
0x50, //80
0xA, //10
0xFF //255
};

public plugin_init() {
register_plugin("HEX TO DEC", VERSION, "diablix")
register_clcmd("say /test", "cmdHexToDec");
}

public cmdHexToDec(id){
new szMessage[128];
new iMesSize = formatex(szMessage, sizeof szMessage - 1, "Hex : ");

for(new i = 0 ; i < sizeof g_iHEX ; i ++)
iMesSize += formatex(szMessage[iMesSize], (sizeof szMessage - 1) - iMesSize, "%d ", g_iHEX[i]);

set_pev(id, pev_effects, g_iHEX[5]); // 16

client_print(id, 3, szMessage);

return 1;
}

  • +
  • -
  • 12


#254564 Spis operatorów

Napisane przez diablix w 30.05.2011 22:30

W TEMACIE R3X'A JUŻ JEST NIECO O BITACH WIĘC JEŻELI SĄDZICIE ŻE TO PLAGIAT TO PROSZĘ WYEDYTOWAĆ DANĄ CZĘŚĆ TEMATU :)

Postaram się wam wytłumaczyć, co oznacza dany operator :)

Operatory arytmetyczne

+ dodawanie
- odejmowanie
* mnożenie
/ dzielenie

integerA = integerA * integerB;


Jednak są też skrócone wersje

+=
-=
*=
/=


dla przykładu mnożenie

integerA *= integerB;



Operator % (modulo)

Dwuargumentowy operator obliczający resztę z dzielenia.

Naprzykład

21%3

reszta z dzielenia = 0

22%3

reszta z dzielenia = 1

client_print(id, 3, "%d", 13%5); // wyświetli się 3


Operatory inkremantacji i dekrementacji

++ zwiększenie danej liczby o 1

integerA++;


-- zmniejszenie danej liczby o 1

integerB--;


Przydatny temat: a++ czy ++a?

Operatory relacji

< mniejszy niż

if(a < b) //jeżeli a jest mniejsze niż b


<= mniejszy lub równy

if(a <= b) //jeżeli a jest mniejsze lub równe b


> większy niż

if(a > b) //jeżeli a jest większe niż b


>= większy lub równy

if(a >= b) //jeżeli a jest większe lub równe b


Dlaczego operatory relacji ?
W wyniku nich otrzymujemy odpowiedzi true/false (prawda / fałsz)

Operatory sumy logicznej i iloczynu logicznego

|| operacja logiczna or (LUB)

if(a == b || a == c) //jeżeli a jest równe b lub jeżeli a jest równe c


&& operacja logiczna and (I)

if(a > b && a > c) //jeżeli a jest większe niż b i jeżeli a jest większe niż c
//Wartości wyrażeń są obliczane od lewej, jeżeli pierwszy czynnik koniunkcji nie będzie prawdziwy sprawdzanie (obliczanie) zostanie przerwane


Operator negacji

! wyrażenie ma wartość true jeżeli czynnik jest mniejszy lub równy ( <= ) 0, natomiast false jeżeli jest większy lub równy ( >= ) 1

if(!a) // w wypadku typu logicznego jeżeli a nie przyjmuje wartości true, w innym wypadku jeżeli a jest równe 0


Operatory bitowe

W Pawn'ie stosowane np do sprawdzania obrażeń.
Wytłumacze tylko te najczęściej używane w amxie. Po więcej zapraszam do tematu R3X'a Operacje bitowe


& bitowy iloczyn logiczny

if(damageBits & (1<<24))


~ bitowa negacja

if(damageBits & ~(1<<24))


Jeżeli popełniłem błędy, krytykowanie mile widziane :)
  • +
  • -
  • 7


#133901 Konwertowanie modeli broni z CS:S do CS 1.6

Napisane przez Abes Mapper w 10.05.2010 18:31

Konwertowanie modeli broni z CS:S do CS 1.6

Poradnik (po angielsku) by Dels © 2009
Spolszczony opis by Abes Mapper © 2010


Spis treści
  • Przegląd
  • Narzędzia
  • Poradnik
         1. Przygotowanie do pracy
         2. Dekompilacja modelu
         3. Eksport tekstur
         4. Aktualizacja map UV
         5. Edycja pliku .qc
         6. Kompilacja modelu
         7. (Nieobowiązkowe) Usuwanie martwych klatek
         8. (Nieobowiązkowe) Obracanie modelu
  • Pytania i odpowiedzi
  • Słowko o podmienianiu muzzle flash
  • Credits

Przegląd
Chciałeś kiedyś mieć model broni z CS:S w CS 1.6 ?
Teraz dowiesz się jak to zrobić ze wszystkimi broniami włączając w to animacje z C4
Dołączona grafika Dołączona grafika
Dołączona grafika Dołączona grafika

Wystarczy że przeczytasz dokładnie ten poradnik punkt za punktem

Narzędzia
Narzędzia wykorzystanie w tym poradniku:
  • GCFScape (Nieobowiązkowe, aby wydobyć model z .GCF)
  • GFlip (Nieobowiązkowe, aby obrócić model. Jest w paczce)
  • Jed Half-Life Model Viewer (Aby zobaczyc model, zmienic rozne rzeczy, itp)
  • HL1 Compiler & Decompiler (Jest w paczce)
  • HL2 Decompiler (Jest w paczce)
  • Milkshape3D (Do ustawienia map UV; chcesz CD-KEY? Pisz na PW; zalecam wersje 1.8.4)
  • VTFEdit (Aby eksportować tekstury)
  • XNView (Nieobowiązkowe jeżeli masz jakiś program graficzny oprócz Painta; do zmienienia rozmiaru i konwertowania tekstur).
potrzebne_narzedzia.zip

Poradnik

Jeżeli masz już wszystkie potrzebne pliki, możesz przejść dalej.

1. Przygotowanie do pracy
  • Stwórz folder o nazwie weapon conversion (nazwa może być dowolna) na pulpicie co łatwi zarządzanie plikami
  • Potrzebujemy jakiegoś modelu z CS:S. Autor użył tego: FPSBANANA > Skins > Counter-Strike: Source > AK-47 > modderfreak's S.T.A.L.K.E.R. AK74u
  • Także potrzebujemy modelu z CS 1.6 (potrzebny jest plik qc z niego).
  • Następnie skopiuj CS:S AK-47 który ściągnąłeś do folderu CSS\AK47, Jeśli jest nadal spakowane to rozpakuj
  • Stwórz w nim folder o nazwie decompiled (albo jak chcesz, tam będą zdekompilowane pliki)
  • Teraz skopiuj model z CS 1.6 (v_ak47.mdl) z cstrike/models do CS16/AK47. Jeśli nie możesz go znaleść, wypakuj z pliku GFC za pomocą programu GCFScape
  • Wypakuj folder tools do stworzonego na początku folderu
    Dołączona grafika
  • Zainstaluj Jed Half-Life Model Viewer, MilkShape3D, VTFEdit i XNView.
  • Twoja struktura folderów powinna wyglądać w ten sposób:
    Dołączona grafika

2. Dekompilacja modelu

Teraz będziesz dekompilować model (CS:S i CS 1.6) używając HL2 MDL Decompiler i MilkShape3D

MODEL Z CS:S

  • Uruchom mdldecompiler.exe który znajduje się w tools\HL2 MDL Decompiler
    Dołączona grafika
  • Wybierz model z CS:S klikając na [...]
    Powinien być w ak47\models\weapons
  • Wybierz folder gdzie będą zdekompilowane pliki
    W tym przypadku ak47\decompiled
  • Zaznacz Dump Old Unweighted SMD's i Do not fix rotations on animations, odznacz Use Steam File Access.
    Obrócenie modelu naprawimy później
  • Naciśnij Extract i czekaj aż się zdekompiluje
    Jeżeli wyskoczył błąd Unable to load model musisz otworzyć model za pomocą Notepad++
    zmienić IDST0 na IDST, (zamieniasz znak który znajduje się za IDST na ,)

MODEL Z CS 1.6

  • Uruchom MilkShape3D
  • Przejdź do Tools -> Kratisto's Half-Life MDL Decompiler v1.2
    Dołączona grafika
  • Wybierz model z CS 1.6 (w tym przypadku v_ak47.mdl)
    Odznacz wszystkie opcja poza QC Script.
    Dołączona grafika
  • Kliknij OK i czekaj aż się zrobi.

3. Eksport tekstur
  • Przejdź do folderu materials\models\weapons\v_models\aksu i kliknij dwa razy na wpn_aksu.vtf żeby otworzyć go w VTFEdit.
    Jeżeli jest więcej niż 1 vtf powinieneś wydobyć wszystkie ale pomiń pliki z _normal, _light i _ref.

    Dołączona grafika
  • Naciśnij File -> Export albo naciśnij Ctrl + E, eksportuj do bmp dla łatwiejszego użytku

    Dołączona grafika
  • Teraz otwórz wyeksportowane tekstury w programie XNView
    Możesz to zrobić także w innym programie graficznym jak photoshop, acdsee, gimp, itp.

    Dołączona grafika
  • Następnie musimy zmienić rozmiar tekstury żeby można było używać w CS 1.6 a także przekonwertować do 256 kolorów (8-bit).
    Przejdź do Obraz -> Zmień rozmiar... albo naciśnij Shift + S, CS 1.6 ma maksymalną wielkość tekstury 512x512 dlatego wpisz 512 w Szerokości i Wysokości
    Bądź pewien że masz zaznaczoną opcję Utrzymaj proporcje

    Dołączona grafika Dołączona grafika
  • Teraz musimy to przekonwertować do 256 kolorów (8-bit).
    Przejdź do Obraz -> Konwertuj do kolorowego..., wybierz 256 kolorów, Dithering: Brak i kliknij OK
    Zapisz zmienioną teksturę do folderu decompiled
    Dołączona grafika Dołączona grafika

4. Aktualizacja map UV
Przed zaczęciem, wypakuj/skopiuj hands_reference.smd i v_hands.bmp do folderu decompiled
Ponieważ potem będzie potrzebny

  • Otwórz MilkShape3D, przejdź do File -> Import -> Half-Life SMD... i wybierz plik smd do CS:S AK-47
    W tym przykładzie będzie nazwany jako aks74u.smd (różni się od innych nazw)

    Dołączona grafika

    Dołączona grafika
  • Widzisz pasek boczny po prawej stronie? Tam jest opcja Select, naciśnij to a będziesz miał dostęp do Select Options i naciśnij przycisk Group

    Dołączona grafika
  • Bardzo dobrze, teraz musisz zaznaczyć wszystkie grupy, będzie to prostsze przeciągając kursorem na drugim oknie (top-right window)

    Dołączona grafika Dołączona grafika
  • Następnie przejdź do Window -> Texture Coordinat Editor albo naciśnij Ctrl + T.

    Dołączona grafika

    Dołączona grafika

    Gdzie są moje mapy UV a tekstura jest taka wielka? Spokojnie, widzisz pole z numerem przy przycisku Scale? Wpisz tam -2 i naciśnij Scale.

    Dołączona grafika
  • Teraz widzisz? Następnie zobacz na przyciski po prawej, tam jest Move, naciśnij go.
    Uzupełnij: Offset: 0.0 -1.0 i naciśnij na M, naciskaj tak M dopóki nie zobaczysz linii idealnie na teksturze

    Dołączona grafika

    Dołączona grafika
  • Zrób tak ze wszystkimi teksturami a kiedy skończysz, eksportuj SMD i nadpisz oryginalny.

    Dołączona grafika

    Dołączona grafika

5. Edycja pliku .qc

Pamiętasz dekompilacje modelu z CS 1.6 ? Teraz go użyjemy
  • Skopiuj v_ak47.qc do folderu decompiled
  • Otwórz v_ak47.qc jakimś edytorem tekstu (notatnik wystarczy)

    Dołączona grafika
  • Otwórz mdldecompiler.qc jakimś edytorem tekstu (notatnik wystarczy).

    Dołączona grafika
  • Teraz musimy edytować v_ak47.qc bazując się na zawartości z mdldecompiler.qc
    Skończone powinno wyglądać tak:

    Dołączona grafika

    A teraz trochę wyjaśnień jak to zrobić
    Pamiętaj że różne modele mają inne qc i inną strukturę. Kolejność animacji typu "shoot", "idle", "reload", muszą być w takiej samej kolejności jak w oryginalnym pliku .qc który został utworzony od modelu z CS 1.6. W przeciwnym wypadku np.: przy przeładowaniu, animacja będzie "draw" czyli wyjęcie broni
  • Najpierw musimy zastąpić sekcję $body aby pasowało do tej z mdldecompiler.qc
    Trzeba usunąć część odnosząca się do rąk ponieważ model już to ma
    Pamiętaj że niektóre modele potrzebują odniesienie do rąk a nie które nie

    Zmień:
    //reference mesh(es)
    $body "rhand" "rhand"
    $body "lhand" "lhand"
    $body "weapon" "f_ak47_template"

    na

    //reference mesh(es)
    $body "weapon" "aks74u"

  • Następnie trzeba zamienić sekcję $attachment aby pasowało do tej z mdldecompiler.qc

    Zmień:
    // 2 attachment(s)
    $attachment 0 "Bone 04" 2.750000 -22.500000 2.900000
    $attachment 1 "Bone52" 0.000000 -3.000000 0.000000

    na

    // 2 attachment(s)
    $attachment "1" "a_ak74" -0.50 14.60 -2.50 rotate 0.00 -0.00 0.00
    $attachment "2" "a_ak74" 0.30 -0.30 -3.00 rotate 25.00 -0.00 -180.00

  • I dlatego że model używa $hboxset "default", trzeba usunąć wszystkie $hbox z tej sekcji
    Niektóre modele mają hitbox'y, które nie były domyślnie, szczególnie własne modele, które mają różne ciała.

    Zmień
    // 4 hit box(es)
    $hbox 0 "Bone04" -1.980000 -8.880000 -1.020000 1.730000 0.030000 1.090000
    $hbox 0 "Bone_Righthand" -1.340000 -2.980000 -0.410000 1.430000 0.000000 0.630000
    $hbox 0 "Bone01" -1.720000 -8.900000 -1.020000 1.990000 0.020000 1.090000
    $hbox 0 "Bone_Lefthand" -1.520000 -3.073735 -0.410000 1.250000 0.000000 0.630000

    na

    // 4 hit box(es)

  • Ostatnie o sekwencji, nie ma dużej różnicy, trzeba trochę zmienić i dodać rotate -90.
    Obracanie potrzebne aby naprawić obrót modelu, pamiętasz kiedy dekompilowałeś model? Model był obrócony o 90 stopni

    Zmień
    // 6 animation sequence(s)
    $sequence "idle1" "idle1" fps 30
    ..

    na

    // 6 animation sequence(s)
    $sequence "idle1" "idle" fps 30 rotate -90 
    ..
  • Zapisz to

6. Kompilacja modelu

Uruchom compiler.bat który znajduje się w tools\HL1 Model Compiler & Decompiler\.
  • Przeciągnij i upuść twoje .qc (w tym przypadku będzie to v_ak47.qc) w oknie kompilatora

    Dołączona grafika
  • Naciśnij Enter i poczekaj aż się zrobi. W sumie to już masz gotowy model ;)

Sprawdź model w Jed Half-Life Model Viewer

Dołączona grafika

Dołączona grafika

7. (Nieobowiązkowe) Usuwanie martwych klatek

Niektóre własne modele mają martwe klatki, dlatego trochę to wygląda jak lagi, ponieważ nie jest zoptymalizowany
HL2 compiler & decompiler i tak wiele razy się model kompiluje i dekompiluje że dodaje parę martwych klatek na początek animacji
Aby to usunąć zrób tak:

  • Otwórz model w Jed Half-Life Model Viewer który przed chwilą skompilowałeś
  • Idź do karty Weapon Origin wybierz jedną z animacji (shoot1 powinna ci teraz pomóc).

    Dołączona grafika
  • Nacisnij Stop i wpisz 0 w widoczne pole
    Patrz tak klatka po klatce od kiedy zacznie się animacja

    Dołączona grafika
  • Zapamiętaj animację którą musisz skasować, np.: z 0-2.
    Potrzebna jest conajmniej jedna animacja która się nie rusza przed rozpoczęciem animacji
  • Teraz otwórz shoot1.smd używając notatnika

    Dołączona grafika
  • Znajdź linie w której jest time 0 a następnie usuń wszystkie linie pomiędzy time 0 a time 3,
    teraz widać że time 3 jest tuż za linią skeleton. Zapisz plik

    Dołączona grafika
  • Zrób tak ze wszystkimi plikami .smd
  • Skompiluj model ponownie

8. (Nieobowiązkowe) Obracanie modelu

Niektóre modele mogą być odwrócone w grze (JHLMV pokazuje model normalnie) zwłaszcza model C4.
Chodzi o to że w grze broń jest po lewej stronie gdy mamy ustawione cl_righthand 1 czyli standardowo po prawej stronie.
Możesz łatwo to naprawić za pomocą programu GFlip który znajduje się w tools\HL1 MDL Compiler & Decompiler

  • Uruchom GFlip.
  • Przeciągnij v_c4.mdl (or albo inny model) którego potrzebujesz odwrócić na okno GFlip

    Dołączona grafika
  • Naciśnij Flip i poczekaj aż się zrobi, GFlip zrobi nowy model o nazwie v_c4_gflip.mdl.
  • Skasuj oryginalny model i zmień nazwę tego utworzonego przez GFlip na v_c4.mdl.
  • Będzie on pokazał jak to było źle (odzwierciedlenie) w JHLMV ale działa poprawnie w grze.
Dołączona grafika

Pytania i odpowiedzi

Nie można skompilować modelu?
    Upewnij się że masz wszystkie potrzebne pliki w jednym folderze i plik .qc jest poprawny, potem skompiluj plugin ponownie.

Błąd: "too many vertices" przy kompilowaniu?
    Musisz podzielić .smd na pare części
  • Uruchom MilkShape3D
  • Załaduj model
  • Zaznacz grupę rąk (już powinieneś wiedzieć jak się zaznacza grupy)
  • Skasuj naciskając "Delete" i powinna zostać broń
  • Eksportuj do osobnego pliku jako weapon.smd (ale nie zamykaj programu)
  • Teraz cofnij akcję (Ctrl+Z)
  • Wybierz Edit -> Select Inverse
  • Skasuj naciskając "Delete" i powinny zostać ręce
  • Eksportuj do osobnego pliku jako hands.smd
    Teraz w pliku .qc powinieneś wpisać tak:
$body "weapon" "weapon"
$body "weapon" "hands"
    Jeżeli nadal błąd występuje to podziel model na mniejsze kawałki

Czarna ręka w JHLMV?
    Upewnij się że skopiowałeś hands_reference.smd i v_hands.bmp do folderu decompiled folder i poprawnie ułożyłeś mapę UV na teksturę w Milkshape3D.

Co z modelami w_ (world) i p_ (player)?
    Dla modelu w_ możesz zrobić to samo co z v_ (view) lecz niestety CS:S nie posiada modeli p_ ponieważ brane są one z modeli v_

Błąd GFlip?
    Czasami autor też to miał, czyścił rejestr używając programu CCleaner i ponownie włączał program GFlip

Słówko o muzzle flash

Czasami kiedy konwertujesz model, nie pokazuje się muzzle flash (ogień po wylocie kuli), to głownie z powodu linii $attachment w pliku .qc która nie działa, należy ponownie połączyć muzzle do kości i dostosować samodzielnie. To samo tyczy się lewej komory wylotowe (miejsce, w którym łuska wyskakuje)
Dlatego $attachment ma zazwyczaj dwie linie - jedna dla muzzle flash, druga dla komory wylotowej łusek

Kość jest zazwyczaj nazywana v_weapon.xxx gdzie xxx = nazwa broni, dla przykładu v_weapon.m249, ale czasami nazwane tylko xxx (m249) albo xxx.parent (m249.parent) albo w innej kombinacji. Możesz sprawdzić to w MilkShape3D

Musisz dostosować $attachment tak aby muzzle flash był we właściwej pozycji.

Credits

  • Dels - autor tematu, ja tylko spolszczyłem
  • Valve za CS 1.6, CS:S i studiomdl.exe.
  • Jed a.k.a Wunderboy za Jed Half-Life Model Viewer.
  • Kratisto za mdldecompiler.exe.
  • Cannonfooder za HL2 MDL Decompiler.
  • Nemesis za GCFScape & VTFEdit.
  • TeH SubSoNiC (FPSBanana.com) za świetny poradnik, autor na jego podstawie zrobił ten
  • ModderFreak (FPSBanana.com) za świetny model AK-47, autor użył go w tym poradniku

------------------------------------------------------------------------------------------------------------------------

Oryginalny temat:
Convert CS:S Weapon to CS 1.6 Tutorial - AlliedModders
Convert CS:S Weapon to CS 1.6 Tutorial - AlliedModders
  • +
  • -
  • 23


#202133 AutoBuy and ReBuy bug Fix

Napisane przez Knopers w 01.01.2011 22:38

Ważna łatka dla wszystkich serwerów(steam jak i non steam). Okazuje się, że HLDS nie jest dobrze zabezpieczony.
Bardzo łatwo jest zbugować komendę która wywoła naruszenie ochrony pamięci, przez co nasz serwer się zresetuje.
Bug ten można przetestować np: za pomocą komendy:
cl_setautobuy *** 12345678901234567890123456789012

Łatka tym razem pochodzi od rosjan:
#define PLUGIN_AUTHOR    "PomanoB & UFPS.Team"
Łatką jest plugin którego działanie polega na ograniczeniu długości argumentu komendy cl_setautobuy oraz cl_setrebuy poprzez blokadę argumentów dłuższych niż 32 znaki.

Załączony plik  autobuyfix.amxx   2,34 KB  1241 Ilość pobrań

Załączony plik  autobuyfix.sma   1,38 KB  2296 Ilość pobrań
  autobuyfix.amxx

lub wersja z banowaniem(cvar amx_buybug_ban 1|0)
Załączony plik  autobuybugban.amxx   3,02 KB  581 Ilość pobrań

Załączony plik  autobuybugban.sma   1,41 KB  1424 Ilość pobrań
  autobuybugban.amxx

Instalacja standardowa.


Za pomoc dziękuję użytkownikowi Milek który to zgłosił oraz Naszemu Administratorowi mgr inż. Pavulon który pomógł w znalezieniu "lekarstwa".


Dla serwerów bez AMXX'a dostępne są biblioteki do podmiany:
Załączony plik  Autobuy_Fix_Linux.rar   1,05 MB  2103 Ilość pobrań

Załączony plik  Autobuy_Fix_Windows.rar   439,41 KB  1351 Ilość pobrań


Problem ten został również rozwiązany przez valve w binarkach w wersji 5006, dostępnych jako wersja beta.
Aby z nich skorzystać należy do komendy startowej dodać:

-beta hlbeta -autoupdate

Oraz ponownie uruchomić serwer.
  • +
  • -
  • 42


#188431 Nie mozna zaladowac modulu 'cstrike'.

Napisane przez ric0 w 13.11.2010 23:48

Przeinstaluj serwer.
  • +
  • -
  • 1


#185116 Obliczanie originów/velocity

Napisane przez R3X w 01.11.2010 20:58

zależnie od tego, w którą stronę obrócony jest gracz tak?


potrzebujesz wektora gdzie gracz patrzy, a jest on w polu v_angle; z tego co piszesz nie interesuje Cię kąt na osi pionowej, więc wyzeruj ten kąt

potem przelicz angle_vector`em z parametrem w prawo, wektor w lewo jest równy
xs_vec_mul_scalar(vOffset, -1.0, vOffset)

gdy masz już wektor w prawo/lewo od gracza ustaw mu długość, teraz przesuń origin gracza o tak przygotowany wektor i masz szukaną pozycję :)

//Weź wektor 'wzroku'
new Float:vAngles[3];
pev(id, pev_v_angle, vAngles);
	
//zeruj pionową oś
vAngles[0] = 0.0;
	
//Przelicz na wektor w prawo
new Float:vOffset[3];
angle_vector(vAngles, ANGLEVECTOR_RIGHT, vOffset);
	
//Przeskaluj do pewnej długości/odległości
xs_vec_mul_scalar(vOffset, 200.0, vOffset);

//Przesuń pozycję gracza o podany wektor
new Float:vOrigin[3];
pev(id, pev_origin, vOrigin);
xs_vec_add(vOrigin, vOffset, vOrigin);

  • +
  • -
  • 1


#177682 Dane o czasach pliku

Napisane przez R3X w 07.10.2010 17:01

Dane o czasach pliku
na razie tylko Linux

Moduł udostępnia 3 funkcje zwracające znacznik czasu ostatniego


native filemtime(const szFile[]); //zapisu
native fileatime(const szFile[]); //odczytu
native filectime(const szFile[]); //zmiany (zapis, zmiana chmod, zmiana właściciela itd)
Jeśli plik nie istnieje zwracają 0


Przykład:
if(filemtime("motd.txt")) < filemtime("motd2.txt")){
	//motd.txt jest starszy niż motd2.txt
}

Załączone pliki


  • +
  • -
  • 8


#176962 "Ignorowanie" sciany przy strzale.

Napisane przez kyku w 04.10.2010 17:18

sprobuj "podpatrzeć" sposob z advanced bulletdamage (czy jak to sie nazywa) ktory nie pokazuje obrazen przez sciane i blokowac dmg
register_forward(FM_TraceLine, "fw_traceline", 1);
+
public fw_traceline(Float:vecStart[3],Float:vecEnd[3],ignoreM,id,trace) 
{

    if(id<1||id>32)
        return FMRES_IGNORED;
        
    if(!is_user_connected(id) || is_user_bot(id))
        return FMRES_IGNORED;

    // not a player entity, or player is dead
    if(!is_user_alive(id))
        return FMRES_IGNORED;
        
    if(!(pev(id,pev_button) & IN_ATTACK))
        return FMRES_IGNORED;
        
        
    new hit = get_tr2(trace, TR_pHit)    
    
    
    if(hit<1||hit>32)
        return FMRES_IGNORED;
    if(is_valid_ent(hit))
    {
        if(is_user_alive(hit))
        {
            if(tutaj_warunek_czy_jest_za_sciana)
                set_tr(TR_flFraction,1.0)
        }
        
    
    }
    return FMRES_IGNORED;
}
(to powinno dzialac)
  • +
  • -
  • 1


#173901 Podmienianie łańcuchów pamięci

Napisane przez Ortega w 24.09.2010 21:10

Dziś przedstawię tak jak już wspominałem kiedyś o tak zwanym patchowaniu stringów w bibliotece swds lub mp.

Najpierw aby zacząć wypada przeczytać ten poradnik.
[Orpheu] Podstawowe zagadnienia. - Nieoficjalny polski support AMX Mod X

Stopujemy się w punkcie deassemblacji. Gdy mamy już otworzoną gotową do czytania bibliotekę, która nas interesuje możemy użyć magicznego skrótu klawiaturowego w IDA Pro, shift + F12.
Wygeneruje nam się lista stringów. Teraz dla dalszego odczytu tudzież prostszego szukania stringów powinniśmy ustawić sortowanie po kolumnie 'string'. To może zająć chwilę, więc nie stresujcie się, idźcie na kawę.

Chcemy stworzyć, a raczej musimy stworzyć sygnaturę do Orpheu, która będzie pokazywała gdzie ma się odbywać cały proces i jaki typ danych ma być uwzględniany.
Nie pozostaje nam nic jak tylko użycie struktury bazowej i jej edycja wedle potrzeb.

Spoiler


NAZWA_SYGNATURY, można dać byle jaką nazwę lecz ważne jej późniejsze zapamiętanie w korzystaniu z pluginu, który będzie wykonywał operacje.
BIBLIOTEKA - mod dla mp.dll, engine dla swds.dll
TYP_DANYCH
Posłużę się tutaj obrazkiem z alliedmods:
Dołączona grafika
Jak widać na obrazku mamy 3 typy danych: data, rdata i text
aby je poprawnie zapisać w Orpheu użyjemy takich odpowiedników:
data - data
rdata - rodata
text - code


Mamy więc sygnaturę, pozostaje nam stworzyć plugin, który będzie ów sygnaturę wykorzystywał do podmiany właśnie łańcuchów w DLL.

#include < amxmodx >
#include < orpheu >
#include < orpheu_memory >

public plugin_precache( ) {
//
}


Do podmiany stringów potrzebne sa nam w zasadzie 2 funkcje, z czego z każdej korzystamy w zależności od potrzeb.
OrpheuMemoryReplace( const memoryDataName[] count, any:... );
OrpheuMemoryReplaceAtAddress( address, const memoryDataName[], count, any:... );


Bardzo ważną , rzeczą o której nie możemy zapomnieć jest długość stringów, string który zamierzamy podmienić ma odpowiednia długość i nowy nie może być dłuższy !

Przyjmijmy, że chcemy podmienić "models/w_c4.mdl", na c5.mdl, zatem:
#include < amxmodx >
#include < orpheu >
#include < orpheu_memory >

public plugin_precache( ) {
OrpheuMemoryReplace( "NAZWA_SYGNATURY", "models/w_c4.mdl", "models/w_c5.mdl" );

}

W zasadzie to już koniec tego pluginu, a więc i poradnika. Nie wspomniałem o drugiej funkcji, której używa się zdecydowanie rzadziej, ponieważ jako pierwszy parametr podmiany trzeba podać adres komórki który będzie podmieniany.
Dobre jest to w przypadku gdy nie chcemy podmieniać wszystkich możliwych stringów podanych w funkcji pierwszej a tylko jedną z danego adresu, jeśli mamy pewność, że właśnie ona nam jest potrzebna ;)
  • +
  • -
  • 5


#172050 Hook Funkcji DLL / Engine

Napisane przez Ortega w 18.09.2010 11:07

Witajcie. Wpadłem sobie na taki pomysł pisząc plugin, żeby wyjaśnić pokrótce w jaki sposób wykorzystywać moduł Orpheu do różnych ciekawych bądź mniej i użytecznych celów.

Zanim przystąpicie do dalszego czytania upewnijcie się, czy na pewno rozumiecie choć trochę strukturę C++ na przykładzie:
void        (*pfnPlaybackEvent)            ( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );


Jeśli tak, to można zaczynać.
W Orpheu zasadniczo do pobrania funkcji używamy dwóch specjalnych natywnych funkcji, które zaraz wymienię oraz opiszę kiedy z czym i po co się to je.
Najpierw wypadałoby dołączyć orpheu.inc, bez którego to ciężko będzie cokolwiek napisać x) Następnie deklarujemy moduły:

#include < amxmodx >
#include < orpheu >
#include < orpheu_stocks >


Kolejnym krokiem do omówienia przed funkcjami pobierającymi będzie lista funkcji biblioteki oraz tworzenie na bazie listy sygnatur niezbędnych do jakiegokolwiek działania pluginu.
enginefuncs_s
Spoiler


dll_functions
Spoiler


Do pierwszych funkcji używamy:
OrpheuGetEngineFunction

Natomiast do drugich:
OrpheuGetDLLFunction


Tworzenie sygnatur
Pokażę na prostym przykładzie jak stworzyć dobrą sygnaturę dla wybranej funkcji:

dla
void			(*pfnClientUserInfoChanged)( edict_t *pEntity, char *infobuffer );

{
    "name" : "NAZWA_SYGNATURY",
    "library" : "BIBLIOTEKA",
    "arguments" :
    [
        {
            "type" : "edict_t *"
        },
        {
            "type" : "char *"
        }
    ]
}

Co ważne dla funkcji z listy pierwszej BIBLIOTEKA nosi nazwę engine, w pozostałych przypadkach mod.
NAZWA_SYGNATURY, będzie miała znaczenie w późniejszym pluginie, więc polecam dać jakąś sensowną oczywiście bez polskich znaków diakrytycznych xD



Dobrze, więc gdy mamy już tą potrzebną wiedzę z powyżej możemy zacząć pisanie naszego pluginu operującego na funkcjach bibliotek gry.
public plugin_precache( ) {
//
}

Wypadałoby stworzyć nową zmienna o typie:
OrpheuFunction

czyli np:
new OrpheuFunction:DLLNumOne;

Przydzielamy teraz jej wartość w tym przypadku chcemy pobrać funkcję engine, więc używamy do tego:
OrpheuGetEngineFunction

czyli
DLLNumOne = OrpheuGetEngineFunction( "DOKLADNA_NAZWA_FUNKCJI_BIBLIOTEKI", "NAZWA_SYGNATURY" );

Teraz chcemy oczywiście hook'nąć tą funkcję, zatem musimy użyć
OrpheuRegisterHook

Następnie w pierwszym parametrze trzeba wskazać funkcję na której chcemy operować w naszym przypadku to zmienna DLLNumOne.
Kolejny parametr to funkcja jaka ma być wykonana na zarejestrowanie hook'a. Ustawimy sobie OnEngineHook.
Ostatnim parametrem może być typ Pre lub Post do tego służą definy orpheu takie jak:
OrpheuHookPre
OrpheuHookPost


No i teraz jak to wygląda wszystko w całości:

#include < amxmodx >
#include < orpheu >
#include < orpheu_stocks >

new OrpheuFunction:DLLNumOne;

public plugin_precache( ) {
DLLNumOne = OrpheuGetEngineFunction( "pfnClientUserInfoChanged", "SYGNAUTRA" );

OrpheuRegisterHook( DLLNumOne, "OnDLLHook", OrpheuHookPre );
}

public OnDLLHook( edict_t, String:infobuffer ) {
//NO I OPERUJEMY NA HOOK'U :)
}


To tyle w tym poradniku, kolejny będzie o szukaniu stringów w DLL ;) Może się komuś przyda. Zamieszczam też plik eiface.h, w którym są jeszcze komentarze dot. kiedy jak i czego dot. niektóre z funkcji.

Załączone pliki


  • +
  • -
  • 3


#164269 Usunięcie celów mapy.

Napisane przez Ortega w 26.08.2010 19:55

Nie bawię w orpheu ale to Cię może naprowadzi, choć pewnie to sam byś zrobił :)
#include < amxmodx >
#include < orpheu >

new g_pGameRules;

public plugin_precache( )
{
OrpheuRegisterHook( OrpheuGetFunction( "InstallGameRules" ), "OnInstallGameRules", OrpheuHookPost );
}

public plugin_init( )
{
OrpheuRegisterHookFromObject( g_pGameRules, "GiveC4", "CGameRules", "OnGiveC4" );
}

public OnInstallGameRules( )
{
g_pGameRules = OrpheuGetReturn( );
}

public OnGiveC4( /*jakies parametry*/ )
{
//kod blokujacy
}

  • +
  • -
  • 2


#155102 2 pytania związane z WinApi.

Napisane przez DarkGL w 27.07.2010 12:16

autobh ;F ?
uchwyt do procesu z uchwytu okna
HWND hOkno=GetForegroundWindow();
DWORD dwPid;
GetWindowThreadProcessId(hOkno, &dwPid);
HANDLE hProcess;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPid);

//tutaj operacje na procesie

CloseHandle(hProcess);

Zobacz temat - [winapi] Uchwyt okna a uchwyt procesu
  • +
  • -
  • 1


#149386 SOLID_BBOX

Napisane przez mgr inż. Pavulon w 04.07.2010 22:16

// pev(entity, pev_solid) values
// NOTE: Some movetypes will cause collisions independent of SOLID_NOT/SOLID_TRIGGER when the entity moves
// SOLID only effects OTHER entities colliding with this one when they move - UGH!
#define SOLID_NOT 0 // No interaction with other objects
#define SOLID_TRIGGER 1 // Touch on edge, but not blocking
#define SOLID_BBOX 2 // Touch on edge, block
#define SOLID_SLIDEBOX 3 // Touch on edge, but not an onground
#define SOLID_BSP 4 // BSP clip, touch on edge, block

ma blokować i tyle, być może masz źle ustawione wymiary

i jeszcze movetype też ważny:
// pev(entity, pev_movetype) values
#define MOVETYPE_NONE 0 // Never moves
#define MOVETYPE_WALK 3 // Player only - moving on the ground
#define MOVETYPE_STEP 4 // Gravity, special edge handling -- monsters use this
#define MOVETYPE_FLY 5 // No gravity, but still collides with stuff
#define MOVETYPE_TOSS 6 // Gravity/Collisions
#define MOVETYPE_PUSH 7 // No clip to world, push and crush
#define MOVETYPE_NOCLIP 8 // No gravity, no collisions, still do velocity/avelocity
#define MOVETYPE_FLYMISSILE 9 // Extra size to monsters
#define MOVETYPE_BOUNCE 10 // Just like Toss, but reflect velocity when contacting surfaces
#define MOVETYPE_BOUNCEMISSILE 11 // Bounce w/o gravity
#define MOVETYPE_FOLLOW 12 // Track movement of aiment
#define MOVETYPE_PUSHSTEP 13 // BSP model that needs physics/world collisions (uses nearest hull for world collision)

  • +
  • -
  • 3


#144865 MySQL - z czym to się je.

Napisane przez R3X w 17.06.2010 18:10

Dobrze, że opisałeś tylko SQL_ThreadQuery, bo ta funkcja wykonuje zapytanie asynchronicznie (tworzy wątek). W drugiej metodzie serwer czeka na odpowiedź MySQLa i robi się lag.
  • +
  • -
  • 1