Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Система дамага и патрон как на SAMP-RP [v 0.1]

Статус
В этой теме нельзя размещать новые ответы.

Alexandr Bochkarev

Ученик
Сразу хочу предупредить, что объяснять доходчиво и понятно для новичков я не умею. Если вы новичок и хотите эту "классную хичу" себе на сервер, но не понимаете суть темы - либо уходите, либо изучайте.

[HR][/HR]

От автора: Система сделана исключительно как на SAMP-RP или на подобии как на SAMP-RP так что и количество наносимого дамага с разного оружия будет в точности как на SAMP-RP. Что есть в этой системе:
- АнтиГМ от пуль;
- Античит на выстрел несуществующих патрон (не контрится, можно считать как античит на оружие и патроны, 2 в 1);
- Античит на ХП и броню;

Описание мануала: делаем собственную систему дамага от пуль, тем самым блокируем любые античиты на гм от пуль.

Ну вот, вступительная часть подошла к концу.
[HR][/HR]

История версий:
0.1 - Написана система
0.2 - Система улучшена (теперь не контриться NOPом SetPlayerHealth), античит на хп, античит на броню, добавлено снятие брони при выдачи дамага игроку, проверка на афк.
0.3 - Исправление недоработки системы, в частности снятие брони без хп и возможность убить 2 раза. Спасибо ему ( ) за то, что сообщил об этом.

[HR][/HR]

Ко всем new
Код:
new pAmmo[MAX_PLAYERS][13]; 
new Float:pHealth[MAX_PLAYERS];
new Float:pArmor[MAX_PLAYERS];
new HWarning[MAX_PLAYERS];
new AWarning[MAX_PLAYERS];
new bool:Killed[MAX_PLAYERS];

Ко всем stock добавим новые функции
1) Функция выдачи оружия сервером. Можете совместить со своей функцией
Код:
stock GivePlayerWeaponAC(playerid,weaponid,ammo)
{
	pAmmo[playerid][GetWeaponSlot(weaponid)] += ammo;
	GivePlayerWeapon(playerid,weaponid,ammo);
	return 1;

}
2) Функции выдачи дамага игроку и обработка дамага
Код:
stock ArmorDamage(playerid,attackerid,weaponid,Float:ammount) 
{
	if(pArmor[playerid] <= 0)   
              return false;

	if(pArmor[playerid] - ammount <= 0) 
		SetPlayerArmorAC(playerid,0.0); 
	else 
		SetPlayerArmorAC(playerid,pArmor[playerid] - ammount); 

	return true;
}

stock HealthDamage(playerid,attackerid,weaponid,Float:ammount) 
{
	if(pHealth[playerid] <= 0)   
              return false;

	if(pHealth[playerid] - ammount <= 0) 
	{
		Killed[playerid] = true;
		SetPlayerHealthAC(playerid,0.0); 
		OnPlayerBulletDeath(playerid,attackerid,weaponid);
	}
	else 
		SetPlayerHealthAC(playerid,pHealth[playerid] - ammount);  

	return true;
}
		

stock GiveDamageForPlayer(playerid,attackerid,weaponid,Float:ammount) 
{ 
	if(pArmor[playerid] >= 1) 
        { 
        	if(pArmor[playerid] - ammount <= 0) 
		{
                	SetPlayerArmorAC(playerid,attackerid,weaponid,0.0);
			HealthDamage(playerid,attackerid,weaponid,ammount - pArmor[playerid]);
		} 
		else 
			ArmorDamage(playerid,attackerid,weaponid,ammount);
        } 
	else 
		HealthDamage(playerid,attackerid,weaponid,ammount);

	return true; 
}
3) Функция GetWeaponSlot (получает слот оружия по его иду)
Код:
stock GetWeaponSlot(weaponid)
{
 	new slot;
 	switch(weaponid)
 	{
   		case 0,1: slot = 0;
   		case 2..9: slot = 1;
   		case 22..24: slot = 2;
   		case 25..27: slot = 3;
   		case 28,29,32: slot = 4;
   		case 30,31: slot = 5;
   		case 33,34: slot = 6;
   		case 35..38: slot = 7;
   		case 16..18,39: slot = 8;
   		case 41..43: slot = 9;
   		case 10..15: slot = 10;
		case 44..46: slot = 11;
	 	case 40: slot = 12;
	 	default: slot = -1;
 	}
 	return slot;
}
4) Функция выдачи ХП сервером (для античита)
Код:
stock SetPlayerHealthAC(playerid,Float:ammount)
{
      if(ammount > 255.0 || ammount < 0.0) return false;
      pHealth[playerid] = ammount;
      SetPlayerHealth(playerid,ammount);
      return true;
}
5) Функция выдачи брони сервером (для античита)
Код:
stock SetPlayerArmorAC(playerid,Float:ammount)
{
      if(ammount > 255.0 || ammount < 0.0) return false;
      pHP[playerid] = ammount;
      SetPlayerArmor(playerid,ammount);
      return true;
}

Создадим свой паблик для обработки смерти от пуль. В чем его преимущество - даже если читер будет блокировать смерть , паблик все равно будет вызываться. Туда вы можете добавить все обычные функции из OnPlayerDeath
Код:
forward OnPlayerBulletDeath(playerid,killerid,weaponid);
public OnPlayerBulletDeath(playerid,killerid,weaponid)
{
// приведу пример использования

	new stringer[144], name1[MAX_PLAYER_NAME],name2[MAX_PLAYER_NAME];
	GetPlayerName(playerid, name1, sizeof(name1));
	GetPlayerName(killerid, name2, sizeof(name2));

	format(stringer,sizeof(stringer),"%s убил %s выстрелами из оружия",name2,name1);
	return SendClientMessageToAll(-1,stringer);
}

В OnPlayerConnect
Код:
for(new i = 0; i <13; i++ ) pAmmo[playerid][i] = 0;

pHealth[playerid] = 0.0;
pArmor[playerid] = 0.0;
HWarning[playerid] = 0;
AWarning[playerid] = 0;
Killed[playerid] = false;


В public OnPlayerWeaponShot вставляем перехват выстрелов и дамага с них
Код:
if(pAmmo[playerid][GetWeaponSlot(weaponid)] <= 0)
	return Kick(playerid); // Вы были кикнуты по подозрению в читерстве! (0xFF1C)

pAmmo[playerid][GetWeaponSlot(weaponid)]--;

if(hittype == 1)
{
        if(PlayerAFK(hitid)) 
		return false; // тут ваша проверка на афк. Я же использую собственный stock PlayerAFK, вы же подгоните под свою систему

        if(Killed[hitid]) 
		return false;

	switch(weaponid)
	{
                // дамаг измерялся с самого самп рп.
		case 23: GiveDamageForPlayer(hitid,playerid,23,14.0); // SD Pistol
		case 24: GiveDamageForPlayer(hitid,playerid,24,47.0); // Deagle
		case 29: GiveDamageForPlayer(hitid,playerid,29,8.0);  // MP5
		case 30: GiveDamageForPlayer(hitid,playerid,30,10.0); // AK-47
		case 31: GiveDamageForPlayer(hitid,playerid,31,10.0); // M4A1
		case 33: GiveDamageForPlayer(hitid,playerid,33,25.0); // Rifle
		default: return false;
	}
	return false;
}

В public OnPlayerSpawn добавляем
Код:
SetPlayerHealthAC(playerid,100); // или другое выдаваемое вами хп при спавне
Killed[playerid] = false;


В public PlayerUpdate (секундный индивидуальный таймер. если у вас нету такового, то ниже будет ссылочка на готовый урок)
Код:
new Float:health, Float:armor;
GetPlayerHealth(playerid,health);
GetPlayerArmor(playerid,armor);
if(health != pHealth[playerid]) HWarning[playerid] ++;
else HWarning[playerid] = 0;
if(armor != pArmor[playerid]) AWarning[playerid] ++;
else AWarning[playerid] = 0;

if(AWarning[playerid] >= 3 || HWarning[playerid] >= 3) Kick(playerid);

[HR][/HR]
- Всю выдачу брони и хп в моде (SetPlayerHealth и SetPlayerArmor) необходимо заменить на новые функции, иначе людей будет кикать

Сразу хочу сказать, что некоторые моменты не доделаны и возможно будут мною исправлены позже (лень).
Система опубликована только для ознакомления, с помощью нее вы можете написать себе много классных античитов, систему прокачки скиллов, а может даже свою систему дамага с проверкой на навык владения оружием игрока и проверку на часть тела, в которую летела пуля. Дерзайте, все в ваших руках.

С вами был автор иследований и мануала iMaddy (Alexandr Bochkarev).
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу