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
 

xCiacho - zdjęcie

xCiacho

Rejestracja: 30.06.2014
Aktualnie: Nieaktywny
Poza forum Ostatnio: 16.10.2014 00:12
-----

#648663 Problem z respawnem CT

Napisane przez Wielkie Jol w 09.07.2014 10:02

Aha, bo widzę, że Ty już coś tutaj z kodem próbowałeś chyba zrobić :P tak mi się chociaż wydaje. Funkcja Respawn_Test odpowiada za respienie się graczy z CT. Powinna ona wyglądać tak, sprawdź czy działa. W powyższym kodzie, sprawdzałeś, czy gracz jest zombiakiem, nie człowiekiem, potem nie zmieniałeś 

public Respawn_Test(id) 
{
if (g_isconnected[id] && cs_get_user_team(id) == CS_TEAM_CT)
{
if (!is_user_alive(id))
cs_set_user_team(id, CS_TEAM_T, CS_T_TERROR);
ExecuteHamB(Ham_CS_RoundRespawn, id)
else
client_print(id, print_center, "%L", LANG_SERVER, "FAIL_RESPAWN");
}
}

  • +
  • -
  • 1


#648630 Problem z respawnem CT

Napisane przez Wielkie Jol w 09.07.2014 06:31

Kod który wysłałeś służy tylko do respawnu zombie, nie CT.


  • +
  • -
  • 1


#647411 Czy ma włączoną tarcze

Napisane przez BlackPerfum w 03.07.2014 22:21

Wybacz źle cię zrozumiałem (moja wina). Trochę pokombinowałem i proszę:

bool:BehindShield(id)
{
	const m_pActiveItem = 373
	const OFFSET_SHIELD = 510
	const HAS_SHIELD = (1<<24)
	const m_fWeaponState = 74
	const WEAPONSTATE_SHIELD_DRAWN = (1<<5)
	if(is_user_alive(id) && get_pdata_int(id,OFFSET_SHIELD,5) & HAS_SHIELD)
	{
		new wid = get_pdata_cbase(id,m_pActiveItem,5)
		if(pev_valid(wid) == 2 && get_pdata_int(wid,m_fWeaponState,4) & WEAPONSTATE_SHIELD_DRAWN)	return true
	}
	return false
}

  • +
  • -
  • 2


#647443 Czy ma włączoną tarcze

Napisane przez BlackPerfum w 04.07.2014 06:05

Znacznie szybciej będzie tak:

pev_sequence spada o 1~5(w zależności od czegoś) zawsze jak gracz trzyma Ctrl (jak puszcza to wzrasta) tzn. jeśli gracz zasłoni się tarczą to twój kod zadziała ale jeś dodatkowo kucnie to już nie

Co do szybkości dzaiłania to masz rację można szybciej ;D
Np. tak:
bool:BehindShield(id)
{
	const OFFSET_SHIELD = 510
	const m_bUsesShield = (1<<16)
	if(is_user_alive(id) && get_pdata_int(id,OFFSET_SHIELD,5) & m_bUsesShield)	return true
	
	return false
}

  • +
  • -
  • 1


#646981 Zwiększenie DMG W Super Vipie

Napisane przez BlackPerfum w 02.07.2014 14:12

Podwoj ;D Pozwól że wskarzę ci twoje błędy ;D
Twoja funkcja:
public TakeDamage(victim, entity, attacker, Float:damage, damagebits)
{
	if(!is_user_connected(attacker) || !is_user_connected(victim))
		return HAM_IGNORED;

	if(get_user_flags(attacker) & ADMIN_LEVEL_H && get_user_weapon(attacker) == CSW_KNIFE)
	{
		SetHamParamFloat(4, 1.2);
	}  
	return HAM_IGNORED;
}
Błędy/brak optymalizacji/niedociągnięcia:
1. sprawdzanie czy osoba której się zadaje dmg jest na serwerze nie ma najmniejszego sensu
gdyż to jest nam najmniej potrzebne. Wiem że to na 99% gracz bo jego classname to "player"
zatem nic nie trzeba sprawdzać ale jeśli chcesz oszczędzić serwerowi zbędnych obliczen możesz
sprawdzić czy gracz w którego trafiliśmy nadal żyje

2. Sprawdzanie flagi nie jest błędem ale to pokazuje brak optymalności gdyż w pluginie z vip'em jest
juz zrobiona zmienna z wartościami adekwatnymi do tego czy jesteśmy vip'em

3. Samo sprawdzenie czy gracz ma nóż aktualnie wyciągnięty nic nam tu nie da bo gracz mógł
rzucic HE i zmienic broń na nóż lub splantować pakę i latać z kosą a funkcja sie wykona :(

4. Ustawiasz dmg równe "1.2"?? Po co przeciez autor tematu chciał 120 z ppm i mniej z lpm.

5. Jeśli zmieniasz wartość Dmg przydało by się zwrócić HAM_HANDLED ;D

To tyle z mojej strony. Poprawnie wyglądająca funkcja:
public TakeDamage(id, ent, attacker, Float:damage, damagebits)
{
	if(!is_user_connected(attacker) || !g_Vip[attacker] || ent != attacker || !is_user_alive(id) || get_user_weapon(attacker) != CSW_KNIFE)	return HAM_IGNORED

	SetHamParamFloat(4, damage*=(1 + 846153/999999)) //Najprostszy sposób pokazania okresu ;D
	return HAM_HANDLED
}
Takie cos zadziała jesli z noży każdy bije normalnie tzn. nic nie zwieksza dmg z noża ani go nie zmniejsza

Teraz pytania:
Dlaczego dmg z ppm będzie sie równać 120?? Już tłumaczę. Tu chodzi łównie o ten kod:
SetHamParamFloat(4, damage*=(1 + 846153/999999))
a dokładnie o to:
damage*=(1 + 846153/999999)
Dlaczego dmg powymnożeniu przez (1 + 846153/999999) daje nam 120 z ppm? Policzmy.
chcemy osiągnąć z ppm dmg równe 120 aktualnie zadajemy 65. To dzielimy 120/65=1.(846153) Czyli pomnożenie aktualnego dmg przez 1.(846153) da nam 120 a że autor tematu napisał że chce jedynie mniejsze dmg z lewego (nie napisał ile) to nie trzeba sprawdzać z jakiego udezenia zadaliśmy cios (czy ppm czy lpm). Dobra to jest jasne ale dlaczego mnożę dmg przez (1+ 846153/999999) bo takie coś jest równe 1.(846153) tzn. piękny sposób na dojście do okresu ;D

Podsyłam gotowego vip'a

Załączone pliki


  • +
  • -
  • 1


#647093 [ROZWIĄZANE] 2 pluginy kożystające z tego samego pliku .vault

Napisane przez BlackPerfum w 02.07.2014 19:04

Zawsze jest sposób xD Tak naprawdę to przejżałem moduł Nvault i trafiłem na to:

Spoiler


Wnioski? Da się otworzyć nvault w dwóch pluginach bo sama funkcja nvault_open zwróci nam uchwyt jeśli jakiś inny plugin nam otworzył ten plik xD Co powinnienieś zrobić. Pobierz uchwyt za pomocą nvault_open ale dopiero w plugin_cfg aby się czasem podczas otwierania tego samego pliku nie wydarzyło się coś nieprzemyślanego :( Potem sobie działaj jak chcesz na tym pliku ale uchwytu nie zamykaj!! Cod zrobi to za ciebie


  • +
  • -
  • 2


#647080 [ROZWIĄZANE] 2 pluginy kożystające z tego samego pliku .vault

Napisane przez BlackPerfum w 02.07.2014 18:08

Witam czy możliwe jest by 2 odzielne pluginy mogły kożystać z 1 pliku nvault?

Alez oczywiście że tak

 

 

 

Bo jak zapisuje z poziomu jednego pluginu dane to ich nie zapisuje fizycznie do pliku chyba że po zapisie zamknę uchwyt nvault

Tu się nie zgodze bo dane się fizycznie(hehe jakie określenie) zapisują zamykanie uchwytu jest po to by zamknąć plik ;D

 

 

Nvault nażuca że każdy plikczek jego może być tylko raz naraz otwarty tzn. tylko jeden proces może nim władać. Naszczęście nam to w ogóle nie przeszkadza.

 

 

Raczej innej możliwości niż otwieranie uchwytu przed zapisem/odczytem i zamykanie po zapisie/odczycie nie ma.

Ja ci znajde inne wyjście xD

 

 

Ja bym zrobił natywa co by przesyłał uchwyt do pliku nvault ale tylko w jednym pluginie ten plik otwierał


  • +
  • -
  • 2


#647126 [ROZWIĄZANE] sprawdzenie flag gracza i jego drużyny

Napisane przez BlackPerfum w 02.07.2014 22:23

1. Kod dawaj w odpowiednich znacznikach
2. Nie tak się sprawdza czy dany gracz posiada daną flagę. Dlaczego nie tak bo gracz może miec pare flag (łącznie z tą twoją wybrana) a warunek się nie wykona gdyż sprawdzasz czy ma tylko tą flagę a nie czy we wszystkich flagach jest ta flaga

Warunek: Jeśli gracz jest w team'ie x lub posiada flagę y
if(get_user_team(id) == x || get_user_flags(id) & y)

  • +
  • -
  • 2


#647353 Czy ma włączoną tarcze

Napisane przez BlackPerfum w 03.07.2014 18:49

Moduły:
Cstrike --> cs_get_user_shield
Fakemeta:  

GetPlayerShield(id)
{
	const OFFSET_SHIELD = 510
	const HAS_SHIELD = (1<<24)
	return get_pdata_int(id,OFFSET_SHIELD,5) & HAS_SHIELD ? 1:0
}

  • +
  • -
  • 3


#555635 SVC_DIRECTOR

Napisane przez BlackPerfum w 16.07.2013 00:23

Jak sprawdzić kiedy się wywoła ten message "SVC_DIRECTOR". Sprawdzałem "register_message" i nie działa. Nie chodzi mi o mieszaniu w funkcji wywołującej a sprawdzenie jakimś sposobem kiedy się wywołuje.


  • +
  • -
  • 1


#560499 Drzewa słownikowe, czyli Trie

Napisane przez BlackPerfum w 03.08.2013 08:58

Zalecam przed nauką obsługiwania się biblioteką "celltrie" naukę "cellarray" gdyż są ów biblioteki dosyć powiązane ze sobą. Niestety biblioteka "celltrie" nie jest opisana ani w dokumentacji na amxx.pl, ani na wiki amxmodx`a, dlatego jeśli popełnię jakieś literówki proszę o wyrozumiałość ;D. Nie sprawdzałem czy w AMXX-Studio jest ich opis gdyż go nie używam. Główną zaletą korzystania z "celltrie" jest możliwość dynamicznego zarządzania pamięcią ;D

 

 

1. Różnice CellTrie od CellArray

w "celltrie" wyszukuje się dane za pomocą stringa (porównywalne do nvault), a w "cellarray" za pomocą indexu.

nie trzeba po kolei zapełniać miejsca jak w przypadku "cellarray" funkcjami "push"

 

 

2. Deklaracja Trie

Tak samo jak w przypadku tablic dynamicznych najpierw trzeba stworzyć zmienną poprzedzoną enum (chodzi o typ zmiennej), która będzie naszym uchwytem.

new Trie:Uchwyt

Po stworzeniu zmiennej możemy do niej "włożyć" nasz uchwyt stwarzany przy deklaracji tablicy Trie.

Uchwyt = TrieCreate()

W ten sposób ulokowaliśmy sobie troszkę miejsca na nasze "drzewko" i uchwyt do niego zapisaliśmy w zmiennej "Uchwyt" ;D

 

 

3. Zapis Danych

Jak wyżej wspomniałem w "celltrie" można od razu zapisywać dane w tym miejscu w którym się chce tzn. nie trzeba(nie można) używać funkcji "push"

Można zapisywać dane na trzy sposoby:

• Jako liczbę/znak:

TrieSetCell(Uchwyt,klucz[],wartość)

• Jako ciąg znaków:

TrieSetString(Uchwyt,klucz[],wartość[])

• Jako tablicę danych:

TrieSetArray(Uchwyt,klucz[],wartość[])

• Uchwyt - Uchwyt do naszego "drzewka" 

• klucz - Unikalny klucz(ciąg znaków)

• wartość - Nasze dane, które chcemy zapisać

 

 

4. Odczyt Danych

Jeśli już potrafimy zapisać dane to pozostaje nam ich odczytanie.

Podobnie jak w przypadku zapisywania, odczytać można na trzy sposoby:

Jako liczbę/znak:

TrieGetCell(Uchwyt,klucz[],wartość)

• Jako ciąg znaków:

TrieGetString(Uchwyt,klucz[],wartość[],rozmiar)

• Jako tablicę danych:

TrieGetArray(Uchwyt,klucz[],wartość[],rozmiar)

• Uchwyt - Uchwyt do naszego "drzewka" 

• klucz - Unikalny klucz(ciąg znaków), którego użyliśmy do zapisu

• wartość - zmienna do której referencyjnie zostaną przekazane dane

• rozmiar - maksymalny rozmiar danych jakie chcemy otrzymać

Dodatkowo każda z powyższych funkcji(pobierających dane) zwraca true/false zależnie od tego czy znaleziono nasz klucz

 

 

4. Czyszczenie/Niszczenie

Tak samo jak w "cellarray" można czyścić dane, a nawet powinno się (gdy zajmują nie potrzebnie miejsce)

Do tego służy funkcja:

TrieClear(Uchwyt)

Kolejnym podobieństwem do "cellarray" jest funkcja pozwalająca na wyczyszczenie danych oraz zwolnienie ulokowanego przez nas miejsca:

TrieDestroy(Uchwyt)

A jeśli nie chcemy czyścić wszystkich danych tylko dane pod jednym kluczem to możemy posłużyć się tą funkcją:

TrieDeleteKey(Uchwyt, klucz[])

• Uchwyt - Uchwyt do naszego "drzewka"

• klucz - Unikalny klucz(ciąg znaków), którego użyliśmy do zapisu

Funkcja "TrieDeleteKey" dodatkowo zwraca czy klucz istnieje

 

4. Funkcje ułatwiające korzystanie z Trie

Niestety jest tylko jedna, która sprawdza czy podany klucz istnieje

TrieKeyExists(Uchwyt, klucz[])

Zwraca czy klucz istnieje

• Uchwyt - Uchwyt do naszego "drzewka"

• klucz - Unikalny klucz(ciąg znaków), którego użyliśmy do zapisu

 

4. Praktyczne użycie

Może teraz troszkę praktyki, a więc wychwyćmy moment gdy gracz wpisz na "say" jakieś słowo z podanego pliku, po czym pojawi mu się tekst napisany obok danego słowa.

Opis całego pluginu zamieszczę w komentarzach

Spoiler

A tak wygląda nasz plik pod ścieżką "addons/amxmodx/configs/Slowa.ini"

amxx Nieoficjalne forum AMX MOD X
[...]

Teraz gdy gracz wpisze na "say" słowo "amxx" to pokaże mu się zielona wiadomość "Nieoficjalne forum AMX MOD X"


  • +
  • -
  • 13


#568055 Podmiana znakówk

Napisane przez BlackPerfum w 29.08.2013 00:18

A więc niedawno pewien użytkownik tego forum poprosił mnie o zrobienie pluginu dzięki któremu będzie możliwa podmiana tekstu nie ingerując w jakiś plugin.

A o to rezultaty mojego główkowania :D

 

opis

Plugin umożliwia ingerowanie w wyświetlany tekst u gracza Menu/Hud/Say/DHud/Motd/Tutor.

Przydatne np. gdy nie posiadamy pliku .sma pluginu a chcemy w nim zmienić/usunąć jakieś napisy :D

 

wymagane moduly

 Orpheu klik

 

konfiguracja

Tekst do podmiany konfigurujemy w pliku pod ścieżką: addons/amxmodx/configs/BlokowanyTekst.ini

Spoiler

 

instalacja

Rozpakowujemy i wrzucamy do naszego folderu "cstrike"

 

inne informacje

- Tekst podmieniający nie powinien być równy dłuższy od podmienianego (czasu brak ale jak będzie to usunę to ograniczenie)

- Tekst podmieniany i podmieniający nie mogą przekroczyć 100 znaków

 

download

Załączony plik  PodmianaZnakow.rar   10,41 KB  208 Ilość pobrań


  • +
  • -
  • 10


#642512 [ROZWIĄZANE] Przesylanie danych o graczu miedzy serwerami

Napisane przez BlackPerfum w 08.06.2014 20:20

Witam, aktualnie jestem w trakcie pisania dosyć wielkiego mod'a ale muszę być świadom czy nie pisze bez sensu. Dlatego mam do was pytanie ale najpierw was wtajemniczę. (Uwaga dalej są informacje ściśle tajne) Mod ma możliwość wysyłania danych pośrednio między serwerami za pomocą socket'ów (oczywiście dane o graczu tzn. położenie,vector,kierunek wzroku,itd). To już zrobione ale nasuwa mi się pytanie ile takich graczy mógł by wytrzymać serwer (zakładamy że mam 10 serwerów każdy 32 sloty, 0 hltv, dosyć wydajne maszyny). Oczywiście wysyłam po to dane o graczy by na innym serwerze widzieć jego poczynania (taki fake (byt ale nie player) gracz co nie zabiera slotów :D

 

Testowałem przy 2 graczach i wszystko pięknie śmiga ale nwm ilu coś takiego wytrzyma. Dlatego proszę o info ;D


  • +
  • -
  • 2


#646756 [ROZWIĄZANE] Czy po użyciu ExecuteHamB(Ham_Killed) będzie dziwna ikonka?

Napisane przez BlackPerfum w 01.07.2014 13:38

ad 1. A jak do 1/x uzyje SetHamParamFloat? Bedzie normalna ikonka + omine cod_inflict_damage !!!

Będzie normalna ale!!! nie jesteś pewien że na pewno go zabijesz bo jakiś inny plugin może zmodyfikować dmg!!! Do zabijania ZAWSZE używaj Ham_Killed ExecuteHamB/ExecuteHam (w zależności czy w danej chwili pożądasz kompatybilności) do zwiększania dmg SetHamParamFloat a do zadawania dmg Ham_TakeDamage ExecuteHamB/ExecuteHam (w zależności czy w danej chwili pożądasz kompatybilności. Do ominięcia głupiej ikonki możesz złapać event DeathMsg'a ;D
 

ad 2. Czyli dmg do zabicia odpada...

Yes...
 

ad 3,4,5 czyli kevlar jest uwzgledniany w pre czy post?

W post na 99,(9)% a w pre to raczej
 

ad 6. Czy zanim zadam dmg to musze sprawdzic czy gracz zyje? Co jesli zadam dmg martwemu?

Nie musisz ale oszczędzisz tym sprawdzaniem wykonania wielu niepotrzebnych funkcji dlatego polecam sprawdzać. Jedyne co można osiągnąć zadawaniem dmg martwym to zdobywaniem fragów do rankingu xD
 

ad 7. Czyli nie ma szans zeby sie uleczyl przez ten czas?

To zależy od typu regeneracji ale standardowa niema szans
 

ad 9. To jak to zrobic. Gubie sie juz... (no dobra. Niech walnie te 4k dmg, o to chodzi w 1/x )

Ale gracz zobaczy to. Bije cały czas normalnie a ty 4k :( A piszę w opisie że zabija przeciwnika nie zwiększa ci dmg. Takie efekty są niepożądane jeśli:

Chce zabic gracza.

Napisałem wyżej jak zabijać


  • +
  • -
  • 1


#646760 Dziwne zachowanie medelu po podmianie.

Napisane przez BlackPerfum w 01.07.2014 13:59

Dziś zabrałem się za optymalizację tego pluginu i lekka jego modyfikację pytanie tylko czy w tym miejscu to jest literówka czy faktycznie chciałeś w ham drop item podmieniać model p_ bo ja bym wolał podmieniać model w_

Tak literówka xD
 

Mógłbyś troszkę przybliżyć jak działa ten twój sposób który pozwala pominąć sprawdzanie stringów, bo mniej więcej rozumiem, ale nie do końca wiem czemu tak a nie inaczej najbardziej zgubiły mnie offsety w get_pdata.

Niestety nigdzie nazwy tego offsetu nie mogłem znaleźć to machnąłem liczbę xD Tak już tłumaczę:

Interesuje nas ta linijka:
new weapon
if(pev_valid(id) != 2 || pev_valid((weapon = get_pdata_cbase(id,35,4))) != 2 || get_pdata_int(weapon,m_iId,4) != CSW_AWP)	return FMRES_IGNORED
Rozłoże to na części i od razu opiszę:
new weapon	//Tworze zmienną xD (tak niespodziewałeś siie tego)

if(pev_valid(id) != 2)	return FMRES_IGNORED
//Sprawdzam czy byt któremu jest ustwiany model posiada dane pdata (dodatkowo czy jest poprawny)

weapon = get_pdata_cbase(id,35,4)
//Zapisuje do zmiennej "weapon" id bytu broni ze lota nr.1 
//Jak pisałem nie mogłem znaleźć nazwy offsetu a do sdk chwilowo dostępu nie mam :(

if(pev_valid(weapon) != 2)	return FMRES_IGNORED
//Sprawdzam czy byt broni w weaponbox'ie posiada dane pdata (dodatkowo czy jest poprawny)

if(get_pdata_int(weapon,m_iId,4) != CSW_AWP)	return FMRES_IGNORED
//Sprawdzam czy byt broni to awp xD
Potestowałem chwilę nad zoomem i może jeszcze dzisiaj polepszę fix'a do zoom'a ale możę
  • +
  • -
  • 2