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
 

Droso - zdjęcie

Droso

Rejestracja: 30.04.2010
Aktualnie: Nieaktywny
Poza forum Ostatnio: 23.09.2022 11:14
*****

#715008 Robienie granatów wrażliwymi na strzał.

Napisane przez grankee w 22.11.2015 08:17

Nie chcecie wiedzieć ile dni straciłem zanim przez przypadek to odkryłem.

 

Chciałem zrobić minę, w którą jak się strzeli to wybuchnie. Użyłem więc granata HE i zmieniłem mu model. Niestety ta klasa bytu (grenade_projectile) nie dawała mi możliwości postrzału. Po ustawieniu offsetów takich jak takedamage na 2 oraz health i maxhealth dawało się zadać obrażenia ale tylko poprzez wybuch czegos obok, strzał przenikał przez niego. Na rozwiązanie wpadłem przez przypadek kiedy to postanowiłem użyć innego bytu (weapon_hegrenade) i po ustawieniu mu kilku właściwości niezwiązanych na pozór z solidem czy collisionem nagle przestał odbierać pociski. Okazało się, że sęk tkwi w ownerze.

Wystarczy ustawić mu ownera na -1 i zacznie przyjmować strzały. Następujący kod sprawi, że granat po strzeleniu w niego wybuchnie:

Entity_SetOwner(iGrenade,-1)
SetEntProp(iGrenade, Prop_Data, "m_takedamage",2);
SetEntProp(iGrenade, Prop_Data, "m_iMaxHealth", 12);
SetEntProp(iGrenade, Prop_Data, "m_iHealth", 10);

Oczywiście rzadko uda się postrzelić granat w locie, ale można to wykorzystać np do jakichś min czy cuś. zhookować spawn bytu, w Timerze na 0.2 sek ustawic mu nextthink na -1 zeby zapobiec wybuchowi i taka mina bedzie sobie lezala az ja ktos postrzeli, a mozna tez jej dorobic jakis aktywator :) Dziele się w z wami tą wiedzą, bo 3 dni mi zajęło zanim to odkryłem. Mam nadzieję, że komuś się to przyda do zrobienia czsegoś fajnego.


  • +
  • -
  • 4


#712670 Zabieranie broni po spawnie.

Napisane przez Ossal w 03.10.2015 09:01

Sprawdzałeś inne funkcje usuwania broni?
 

//funkcja usuwajaca wszsytkie bronie, wraz z nozem:
stock UsunWszystkieBronie(id){
	static ent
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
	if (!pev_valid(ent)) return;
	
	dllfunc(DLLFunc_Spawn, ent)
	dllfunc(DLLFunc_Use, ent, id)
	engfunc(EngFunc_RemoveEntity, ent)
	return
}

albo znane wszystkim stripweapons?

#include <StripWeapons>

StripWeapons(id, Primary);
StripWeapons(id, Secondary);
StripWeapons(id, Knife);
StripWeapons(id, Grenades);

Nie wszyscy to wiedzą (ja na przykład doszedłem do tego sam w praktyce) ale ta funkcja w przypadku flashbanga zawiedzie, ponieważ zabierze mu broń, ale ammo jakie ma w granacie ( ammo w granacie :D) zostanie na poziomie na przykład 1, więc przy otrzymania granatu nawet w następnej rundzie zamiast jednego będzie mieć dwa (pod warunkiem, że nie umrze w międzyczasie :P), żeby pozbyć się tego buga wystarczy wyzerować ammo flasha przy zabieraniu granatów :)

cs_set_user_bpammo(id,CSW_FLASHBANG,0)

i po problemie :)
możesz ewentualnie usunąć konkretną broń, ale raczej nie polecam :P

stock ham_fm_strip_weapon(id, weapon[]){
	if(!equal(weapon, "weapon_", 7)) 
		return 0;
	new wId = get_weaponid(weapon);
	if(!wId) 
		return 0;
	new wEnt;
	while((wEnt = engfunc(EngFunc_FindEntityByString,wEnt,"classname", weapon)) && pev(wEnt, pev_owner) != id) {}
	if(!wEnt) 
		return 0;
	
	if(get_user_weapon(id) == wId) 
		ExecuteHamB(Ham_Weapon_RetireWeapon, wEnt);
	
	if(!ExecuteHamB(Ham_RemovePlayerItem, id, wEnt)) 
		return 0;
	ExecuteHamB(Ham_Item_Kill, wEnt);
	
	set_pev(id, pev_weapons, pev(id, pev_weapons) & ~(1<<wId));
	return 1;
}

Sprawdź inny sposób zabierania broni, amx lubi płatać figle :P Pozdrawiam :)
PS Sztuczne odrodzenia gracza są dość dziwne, dlatego sprawdź większe opóźnienie :P


  • +
  • -
  • 1


#707511 NetBufExtender

Napisane przez GwynBleidD w 24.07.2015 09:06

Co to za błędy?



Błąd Reliable channel overflowed pojawia się, gdy do gracza wysyłanych jest zbyt dużo dodatkowych informacji w kanale Reliable. Tymi informacjami mogą być np wiadomości HUD, menu, informacja o zabiciu, zmiana modeli gracza itp, itd. Kanałów jest 2: Reliable i Unreliable, różnica między nimi jest dość prosta: przy zapełnieniu kanału Reliable gracz zostanie kicknięty, przy zapełnieniu kanału Unreliable, niektóre wiadomości przez niego wysyłane zaczną się gubić (np gracz nie będzie widział aktualnego HUDa).

 

Skąd się biorą?


Serwer sam z siebie wysyła dość sporo informacji do gracza. Szczególnie przy spawnie gracza wysyłanych jest sporo informacji o inicjującym się świecie - modele graczy spawnujących się na mapie, bronie itp. Domyślnie sam silnik HLDS nie zapełni tego kanału, jednak twórcy pluginów dodają własne informacje do tego kanału typu: informacje w HUD, liczniki, zmiana modeli itp. Jeśli robią to w niewłaściwym momencie i w zbyt dużej ilości, gracz zostanie kicknięty z serwera.

 

Jak rozwiązać problem?


Sposoby są 2: zmniejszenie ilości wysyłanych informacji przez pluginy (lub przesunięcie wysyłania informacji tak, żeby nie pokrywały się z dużą ilością rzeczy wysyłanych przez sam serwer) lub powiększenie bufora.

 

Plugin poniżej robi właśnie to drugie, powiększa domyślny rozmiar bufora, dzięki czemu trudniej jest go przepełnić.

 

Pamiętaj! to nie jest rozwiązanie na wszystkie Twoje problemy! Po 1. jeśli jakiś konkretny plugin powoduje częste wywalanie graczy z tym komunikatem, zoptymalizuj go odpowiednio, ogranicz korzystanie z kanału reliable, przesuń niektóre rzeczy (jak np licznik prędkości, informacja o statystykach odświeżana cały czas itp) do kanału unreliable, gdzie nie będą stanowić problemu. Głównie tyczy się to twórców pluginów: skupcie się na ich optymalizacji zamiast omijać problem dodając do swojego pluginu ten moduł, żeby zwiększyć kanał reliable!

 

Plugin prócz zwiększenia kanału reliable, powiększa również bufory spektatorów i bufor SignOn. Działa on zarówno po stronie klienta, jak i serwera. Jego użycie może spowodować lekkie opóźnienie w wyświetlaniu informacji po stronie gracza - paczki danych są dzielone jeśli zajdzie taka potrzeba.

 

Instalacja:


Standardowo instalujemy ten plugin, jak wszystkie pluginy metamoda. Rozpakuj paczkę do folderu cstrike (lub innego folderu moda, jeśli stawiasz np. serwer dod) tak, aby zawartość folderu addons została nadpisana. Następnie dodaj poniższe linie (nie jest błędem dodanie obu, chociaż wystarczy jedna - zgodna z systemem operacyjnym serwera) do plugins.ini metamoda (domyślnie: addons/metamod/plugins.ini):

; NetBufExtender
win32 addons\nbex\nbex.dll

linux addons/nbex/nbex.so

Pobieranie


Wersja 1.0: Załączony plik  NetBufExtender_1_0.zip   46,57 KB  628 Ilość pobrań

 

Źródło: http://cs.rin.ru/for...hp?f=10&t=66907


  • +
  • -
  • 9


#695017 Ad-Block

Napisane przez aquax w 31.03.2015 16:47

Wielkie dzięki za udostępnienie pluginu na blokadę tego dziadostwa.
Może wreszcie ludzie jak się zabezpieczą przestaną pozywać moją sieć, że reklamuje.
 
Pozdro. <ciach>.
  • +
  • -
  • -6


#689688 Pseudo stock na zmiane recoil'a

Napisane przez plx211 w 21.02.2015 16:20

Witam,
Jako że w csgo nie można użyć "m_vecPunchAngle", przygotowałem stocka do zmianny recoil'a w broni (chociaż zbytnio nie ma sensu tego trzymać w stocku :D):
stock SetClientRecoil(client, value){
	new m_Offset=FindSendPropOffs("CWeaponCSBase","m_iRecoilIndex");
	SetEntData(GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"), m_Offset, value);
}
"m_iRecoilIndex" zawiera liczbę pocisków wystrzelonych przez broń, która po pewnnym czasie (jak nie strzelamy) jest zerowana.
Cały trick polega na tym aby przy evencie "weapon_fire" (najlepiej pre) wywoływać podanny wyżej kod, dzięki czemu będziemy strzelać non stop z broni tak jak byśmy strzelali danym pociskiem (value)
np. dla value = 0 będziemy nonstop strzelać tak jak byśmy strzelali pierwszym pociskiem.
 
Przepraszam za błędy i "łopatologiczny" opis, ale nie stety nie jestem najlepszym "polonistą" :D
 
 
screen bez zmianny:
http://imgur.com/e9UlRZU
 
screen zmiana z eventem weapon_fire (pre):
http://imgur.com/ieCHtbp
  • +
  • -
  • 6


#648270 Cvary - tak jakby cache

Napisane przez sebul w 07.07.2014 13:39

Przeglądając różne stronki, znalazłem nawet ciekawy i być może przydatny kod do cvarów.
enum ValueType {
	ValueType_Int = 0,
	ValueType_Bool,
	ValueType_Float,
	ValueType_Flag
};

enum ConVar {
	Handle:ConVarHandle,		// Handle of the convar.
	ValueType:ConVarType,	// Type of value. (int, bool, float)
	any:LastConVarValue,
	any:PrevConVarValue,		// Previous value.
	any:ConVarValue			// The value.
};

stock AddConVar(newCon[ConVar], ValueType:type, ConVarChanged:callback, Handle:conVarHandle) {
	newCon[ConVarHandle] = conVarHandle;
	newCon[ConVarType] = type;

	if(conVarHandle != INVALID_HANDLE) {
		SetConVarDefault(newCon);
		HookConVarChange(conVarHandle, callback);
	}
}

stock AddConVarNoHook(newCon[ConVar], ValueType:type, Handle:conVarHandle) {
	newCon[ConVarHandle] = conVarHandle;
	newCon[ConVarType] = type;

	if(conVarHandle != INVALID_HANDLE) {
		SetConVarDefault(newCon);
	}
}

stock SetConVarDefault(setCon[ConVar]) {
	decl String:defCon[32];
	GetConVarDefault(setCon[ConVarHandle], defCon, 32);
	switch(setCon[ConVarType]) {
		case ValueType_Int:		setCon[ConVarValue] = setCon[PrevConVarValue] = setCon[LastConVarValue] = StringToInt(defCon);
		case ValueType_Bool:		setCon[ConVarValue] = setCon[PrevConVarValue] = setCon[LastConVarValue] = bool:StringToInt(defCon);
		case ValueType_Float:	setCon[ConVarValue] = setCon[PrevConVarValue] = setCon[LastConVarValue] = StringToFloat(defCon);
		case ValueType_Flag:		setCon[ConVarValue] = setCon[PrevConVarValue] = setCon[LastConVarValue] = ReadFlagString(defCon);
	}
}

stock UpdateConVarValue(upCon[ConVar]) {
	upCon[PrevConVarValue] = upCon[ConVarValue];
	switch(upCon[ConVarType]) {
		case ValueType_Int:		upCon[ConVarValue] = GetConVarInt(upCon[ConVarHandle]);
		case ValueType_Bool:		upCon[ConVarValue] = GetConVarBool(upCon[ConVarHandle]);
		case ValueType_Float:	upCon[ConVarValue] = GetConVarFloat(upCon[ConVarHandle]);
		case ValueType_Flag: {
			decl String:flagCon[32];
			GetConVarString(upCon[ConVarHandle], flagCon, 32);
			upCon[ConVarValue] = ReadFlagString(flagCon);
		}
	}
}

stock SetConVarValue(setCon[ConVar], {_,bool,Float}:conVarValue, bool:replicate=false, bool:notify=false) {
	setCon[PrevConVarValue] = setCon[ConVarValue];
	switch(setCon[ConVarType]) {
		case ValueType_Int:		SetConVarInt(setCon[ConVarHandle], _:conVarValue, replicate, notify);
		case ValueType_Bool:		SetConVarBool(setCon[ConVarHandle], bool:conVarValue, replicate, notify);
		case ValueType_Float:	SetConVarFloat(setCon[ConVarHandle], Float:conVarValue, replicate, notify);
		case ValueType_Flag: {
			decl String:flagCon[32];
			FindFlagString(_:conVarValue, flagCon, 32);
			SetConVarString(setCon[ConVarHandle], flagCon, replicate, notify);
		}
	}
	setCon[ConVarValue] = conVarValue;
}

stock bool:IsConVarValueChanged(isCon[ConVar]) {
	return bool:(isCon[PrevConVarValue] != isCon[ConVarValue]);
}

stock CheckToggleConVarValue(cheCon[ConVar]) {
	if(cheCon[PrevConVarValue] && !cheCon[ConVarValue]) {
		return -1;
	}
	else if(!cheCon[PrevConVarValue] && cheCon[ConVarValue]) {
		return 1;
	}
	return 0;
}
Trzeba jeszcze dodać parę rzeczy
enum _:eCvary {		// ustawiamy według własnych potrzeb
	CvarPierwszy = 0,
	CvarDrugi,
	CvarTrzeci			// itd.
};

new g_ConVars[eCvary][ConVar];

public OnConfigsExecuted() {
	for(new i=0; i<eCvary; ++i) {
		UpdateConVarValue(g_ConVars[i]);
	}
}
public OnConVarChange(Handle:conVar, const String:oldValue[], const String:newValue[]) {
	for(new i=0; i<eCvary; ++i) {
		if(conVar == g_ConVars[i][ConVarHandle]) {
			UpdateConVarValue(g_ConVars[i]);
			break;
		}
	}
}
A dodawanie cvaru robi się tak
AddConVar(g_ConVars[CvarPierwszy], ValueType_Int, OnConVarChange, CreateConVar("sm_cvarpierwszy", "150"));
AddConVar(g_ConVars[CvarDrugi], ValueType_Bool, OnConVarChange, CreateConVar("sm_cvardrugi", "1"));
AddConVar(g_ConVars[CvarTrzeci], ValueType_Float, OnConVarChange, CreateConVar("sm_cvartrzeci", "15.0"));
Generalnie co nam to daje? W jednej zmiennej globalnej mamy dostęp do uchwytu, typu i wartości cvaru, czy to dobre rozwiązanie? Nie wiem, niech każdy sam zadecyduje.

Oczywiście wykorzystać to można tylko do cvarów, które są liczbami, chociaż jakby pokombinować, to i ciągi znaków dało by się dodać.

Załączone pliki


  • +
  • -
  • 5


#687449 Generator

Napisane przez Doktorek* w 10.02.2015 16:05

Witam mam pomysł z generatorem klas CS:GO. Co wy o tym sądzicie ?


  • +
  • -
  • -2


#285505 SDKHooks 2.0.0

Napisane przez Nomaf w 20.08.2011 12:22

SDKHooks


Dołączona grafika

SDKHooks to biblioteka z bardzo dobrymi funkcjami, umożliwiającymi o wiele lepsze pisanie pluginów. Praktycznie każda większa modyfikacja wymaga SDKHooks to działania, więc warto zawczasu wyposażyć się w te potężne narzędzie skryptera. Jest ono dostępne dla Windows'a i Linux'a oraz Mac'a, ale jego nie będę wrzucał, bo i tak nikt nie zakłada na tym serwerów :)

Dołączona grafika

Zawartość archiwum wrzucamy do /nazwa_gry/.

Dołączona grafika

Aby skorzystać z biblioteki, należy na początku pluginu dać:
#include <sdkhooks>

Podstawowy hook (możemy go wpisać praktycznie, gdzie chcemy):
SDKHook(entity, SDKHookType:type, SDKHookCB:callback)


1 parametr to byt (id, index, client, ent, entity czy co tam wymyślimy)
2 parametr to typ hook'a. Dostępne są:
Spoiler

3 parametr to natomiast nazwa funkcji, która będzie się wykonywała przy hook'u. Możliwości:
Spoiler


Przykładowy kod (zwiększa ilość hp o 1 po zadaniu obrażeń):
public OnClientPutInServer(client)
{
SDKHook(client, SDKHook_OnTakeDamagePost, OnTakeDamagePost);
}

public OnTakeDamagePost(victim, attacker, inflictor, Float:damage, damagetype)
{
SetUserHealth(attacker, GetUserHealth(attacker) + 1)

return Plugin_Changed
}


Dołączona grafika

Windows:
Załączony plik  sdkhooks-2.0.0-hg127-windows.zip   732,85 KB  382 Ilość pobrań


Linux:
Załączony plik  sdkhooks-2.0.0-hg127-linux.tar.gz   523,11 KB  363 Ilość pobrań


Poradnik stworzony przez: Nomaf dla AMXX.pl - Support AMX Mod X
Kopiowanie bez mojej zgody jest zakazane!


  • +
  • -
  • 7


#686258 Czy opłacalne jest postawienie serwera FFA?

Napisane przez `Krzychuu w 03.02.2015 21:04

mam serwer paintball+perki+exp i awanse klas i nadal nikt nie gra

 




#686200 Pobranie id gracza na którego patrzę jak nie żyję.

Napisane przez mastah7991 w 03.02.2015 16:10

by nie dawało errorów :X (+ nie pętla tylko warunek O.o)


  • +
  • -
  • 2


#686189 Pobranie id gracza na którego patrzę jak nie żyję.

Napisane przez mastah7991 w 03.02.2015 14:59

new iSpecMode = GetEntProp(iClient, Prop_Send, "m_iObserverMode");
   if(iSpecMode == 4 || iSpecMode == 5) 
   {
	new iSpectatedClient = GetEntPropEnt(iClient, Prop_Send, "m_hObserverTarget");
   }

  • +
  • -
  • 2


#686158 Pobranie id gracza na którego patrzę jak nie żyję.

Napisane przez Linux' w 03.02.2015 12:53

Na śmierć zapomniałem o tej funkcji xD. Postaram się to dzisiaj sprawdzić. Patrz PW

 

Ja juz to sprawdzilem :P. Dzialac dziala ale sa errory. Uzyj

GetEntProp(client, Prop_Send, "m_iObserverMode");

  • +
  • -
  • 2


#685979 Odpowiednik nvault + inna lista eventów

Napisane przez DarkGL w 02.02.2015 11:47

1. https://wiki.alliedm...eMod_Scripting)
  • +
  • -
  • 2


#685971 Odpowiednik nvault + inna lista eventów

Napisane przez sebul w 02.02.2015 10:46

2. https://wiki.alliedm...:_Source_Events


  • +
  • -
  • 2


#685966 Osoby roku 2014 - Wyniki

Napisane przez DarkGL w 02.02.2015 10:06

Ktoś musiał :D
  • +
  • -
  • 5