←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

CoD Nowy
Zatrute Naboje

Locked

  • +
  • -
Grandi's Photo Grandi 29.05.2011

Mam pytanie, czy wie ktoś jak zrobić perk: Zatrute Naboje, które miały by 1/x na zatrucie przeciwnika, graczowi który zostanie zatruty odejmuje sie co 5 sekund 25 hp przez 30 sekund. Czyli może stracić 125 hp. To taki przykład. Jeżeli ktoś dał by radę zrobić bym był wdzięczny :)
Quote

  • +
  • -
^Grzyboo's Photo ^Grzyboo 29.05.2011


#define TASK_ZATRUCIE 555

public plugin_init()
{

RegisterHam(Ham_TakeDamage, "player", "TakeDamage");

}

public TakeDamage(victim, ifinflictor, attacker, Float:damage, damagebits)
{

if(!is_user_connected(attacker) || get_user_team(attacker) == get_user_team(victim))
return PLUGIN_CONTINUE;

new szansa = 25 //Zmieniasz 25 na swoja liczbe (w procentach), czyli teraz jest 25
if(random_num(1, 100) <= szansa)
{
Zatrucie(victim, 30.0);
client_print(victim, print_chat, "[%s] Zatrules %s (%d%% szansy).", PREFIX, nazwa_gracza(victim), szansa);
}

}

public Zatrucie(id, czas)
{
powtarzaj = czas/5
set_task(5.0, "OdejmijHp", id+TASK_ZATRUCIE, _, "b", powtarzaj)
}

public OdejmijHP(id)
{
id -= TASK_ZATRUCIE;
fakedamage(id, "Zatrucie", 25.0, DMG_ACID)
}



Pisane na szybko :>
Edited by ^Grzyboo, 29.05.2011 16:31.
Quote

  • +
  • -
Grandi's Photo Grandi 29.05.2011

Niestety występują błędy przy kompilacji. Jakie moduły dać?
Quote

  • +
  • -
Nomaf's Photo Nomaf 29.05.2011

To nie będzie dobrze działać.
Gdzie są użyte funkcje cod_perk_enabled i cod_perk_disabled ?
Bez tego to każdy będzie miał zatrute naboje...
I jeszcze potrzeba zarejestrować perk.


Moduły potrzebne to na pewno hamsandwich i chyba fakemeta.
Quote

  • +
  • -
Agent's Photo Agent 29.05.2011

Nie wiem co w Codzie jest zarejestrowane, lecz patrząc na funkcje:
#include <hamsandwich>
potrzebne by było

P.S. Zarzuć log z kompilacji najlepiej ;]
Edited by Agent, 29.05.2011 19:13.
Quote

  • +
  • -
Grandi's Photo Grandi 29.05.2011

Zrobiłem coś takiego i przy kompilacji wyskakują takowe błędy
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <hamsandwich>
#include <codmod>
#include <fakemeta>

#define TASK_ZATRUCIE 555

new const perk_name[] = "Zatrute Naboje";
new const perk_desc[] = "1/4 szansy na zatrucie przeciwnika";

new bool:ma_perk[33];

public plugin_init()
{
register_plugin(perk_name, "1.0", "Noname");

cod_register_perk(perk_name, perk_desc);

RegisterHam(Ham_TakeDamage, "player", "TakeDamage");

}

public cod_perk_enabled(id)
ma_perk[id] = true;

public cod_perk_disabled(id)
ma_perk[id] = false;


public TakeDamage(victim, ifinflictor, attacker, Float:damage, damagebits)
{

if(!is_user_connected(attacker) || get_user_team(attacker) == get_user_team(victim))
return PLUGIN_CONTINUE;

new szansa = 25 //Zmieniasz 25 na swoja liczbe (w procentach), czyli teraz jest 25
if(random_num(1, 100) <= szansa)
{
Zatrucie(victim, 30.0);
}

}

public Zatrucie(id, czas)
{
powtarzaj = czas/5
set_task(5.0, "OdejmijHp", id+TASK_ZATRUCIE, _, "b", powtarzaj)
}

public OdejmijHP(id)
{
id -= TASK_ZATRUCIE;
fakedamage(id, "Zatrucie", 25.0, DMG_ACID)
}



Błędy:
codperk_zatrutenaboje.sma(41) : warning 213: tag mismatch
codperk_zatrutenaboje.sma(44) : warning 209: function "TakeDamage" should return a value
codperk_zatrutenaboje.sma(48) : error 017: undefined symbol "powtarzaj"
codperk_zatrutenaboje.sma(48 -- 49) : warning 215: expression has no effect
codperk_zatrutenaboje.sma(49) : error 035: argument type mismatch (argument 5)
codperk_zatrutenaboje.sma(55) : error 017: undefined symbol "fakedamage"
Quote

  • +
  • -
^Grzyboo's Photo ^Grzyboo 29.05.2011

Fakedamage jest w engine, nie fakemecie.




/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <hamsandwich>
#include <codmod>
#include <engine>

#define TASK_ZATRUCIE 555

new const perk_name[] = "Zatrute Naboje";
new const perk_desc[] = "1/4 szansy na zatrucie przeciwnika";

new bool:ma_perk[33];

public plugin_init()
{
register_plugin(perk_name, "1.0", "Noname");

cod_register_perk(perk_name, perk_desc);

RegisterHam(Ham_TakeDamage, "player", "TakeDamage");

}

public cod_perk_enabled(id)
ma_perk[id] = true;

public cod_perk_disabled(id)
ma_perk[id] = false;


public TakeDamage(victim, ifinflictor, attacker, Float:damage, damagebits)
{

if(!is_user_connected(attacker) || get_user_team(attacker) == get_user_team(victim))
return HAM_IGNORED;

new szansa = 25 //Zmieniasz 25 na swoja liczbe (w procentach), czyli teraz jest 25
if(random_num(1, 100) <= szansa)
{
Zatrucie(victim, 30.0);
}

return HAM_IGNORED;
}

public Zatrucie(id, Float:czas)
{
new powtarzaj = floatround(czas / 5.0);
set_task(5.0, "OdejmijHp", id+TASK_ZATRUCIE, _, _, "b", powtarzaj);
}

public OdejmijHP(id)
{
id -= TASK_ZATRUCIE;
fakedamage(id, "Zatrucie", 25.0, DMG_ACID)
}


i Nomaf gada głupoty...
musisz dodać if(ma_klase[id]) i już tylko jedna osoba będzie miała.


zrób tak:

if(ma_klase[attacker])
{
new szansa = 25 //Zmieniasz 25 na swoja liczbe (w procentach), czyli teraz jest 25
if(random_num(1, 100) <= szansa)
{
Zatrucie(victim, 30.0);
}
}

Edited by ^Grzyboo, 29.05.2011 20:24.
Quote

  • +
  • -
Windowspl's Photo Windowspl 29.05.2011

Ja zrobiłem tak nie wiem czy działa nie znam się tak na tym :P

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <codmod>
#include <hamsandwich>
#include <engine>

#define TASK_ZATRUCIE 555

new const perk_name[] = "Zatrute Naboje";
new const perk_desc[] = "1/4 szansy na zatrucie przeciwnika";

new bool:ma_perk[33];
new powtarzaj;
new zatrucie;

public plugin_init()
{
        register_plugin(perk_name, "1.0", "Noname");

        cod_register_perk(perk_name, perk_desc);

        RegisterHam(Ham_TakeDamage, "player", "TakeDamage");

}

public cod_perk_enabled(id)
{
        ma_perk[id] = true;
}
   
public cod_perk_disabled(id)
{
        ma_perk[id] = false;
}

public TakeDamage(victim, ifinflictor, attacker, Float:damage, damagebits)
{
                
        if(!is_user_connected(attacker) || get_user_team(attacker) == get_user_team(victim))
        return PLUGIN_CONTINUE;
        
                
        new szansa = 25 //Zmieniasz 25 na swoja liczbe (w procentach), czyli teraz jest 25
        if(random_num(1, 100) <= szansa)
        {
                Zatrucie(victim, 30.0);
        }
        
}

public Zatrucie(id, czas)
{
        powtarzaj = czas/5
        set_task(5.0, "OdejmijHp", id+TASK_ZATRUCIE, _, powtarzaj)
}

public OdejmijHP(id)
{
        id = TASK_ZATRUCIE;
        fakedamage(id, "Zatrucie", 25.0, DMG_ACID)
}

Dodano 29 maj 2011 - 20:26:
Jednak nie działa :P
Quote

  • +
  • -
^Grzyboo's Photo ^Grzyboo 29.05.2011

Ja już zrobiłem i działa na pewno. Proponuje jeszcze dodać Odrodzenie i tam:


if(task_exist(id + TASK_ZATRUCIE))
remove_task(id + TASK_ZATRUCIE)


Wtedy w nowej rundzie już nie będzie odejmować hp
Edited by ^Grzyboo, 29.05.2011 20:31.
Quote

  • +
  • -
Grandi's Photo Grandi 29.05.2011

Jak możesz Grzyboo daj cały sma:)
Quote

  • +
  • -
^Grzyboo's Photo ^Grzyboo 29.05.2011


/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <hamsandwich>
#include <codmod>
#include <engine>

#define TASK_ZATRUCIE 555

new const perk_name[] = "Zatrute Naboje";
new const perk_desc[] = "1/4 szansy na zatrucie przeciwnika";

new bool:ma_perk[33];

public plugin_init()
{
register_plugin(perk_name, "1.0", "Noname");

cod_register_perk(perk_name, perk_desc);

RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
RegisterHam(Ham_Spawn, "player", "Odrodzenie", 1);
}

public Odrodzenie(id)
{
if(task_exists(id + TASK_ZATRUCIE))
remove_task(id + TASK_ZATRUCIE)
}
public cod_perk_enabled(id)
ma_perk[id] = true;

public cod_perk_disabled(id)
ma_perk[id] = false;


public TakeDamage(victim, ifinflictor, attacker, Float:damage, damagebits)
{

if(!is_user_connected(attacker) || get_user_team(attacker) == get_user_team(victim))
return HAM_IGNORED;

if(ma_perk[attacker])
{
new szansa = 25 //Zmieniasz 25 na swoja liczbe (w procentach), czyli teraz jest 25
if(random_num(1, 100) <= szansa)
{
Zatrucie(victim, 30.0);
}
}

return HAM_IGNORED;
}

public Zatrucie(id, Float:czas)
{
new powtarzaj = floatround(czas / 5.0);
set_task(5.0, "OdejmijHp", id+TASK_ZATRUCIE, _, _, "b", powtarzaj);
}

public OdejmijHP(id)
{
id -= TASK_ZATRUCIE;
fakedamage(id, "Zatrucie", 25.0, DMG_ACID)
}
Quote

  • +
  • -
Windowspl's Photo Windowspl 29.05.2011

A jeśli bym chciał zrobić taką klase to można tak ?
#include <amxmodx>
#include <hamsandwich>
#include <codmod>
#include <engine>

#define TASK_ZATRUCIE 555

new const nazwa[] = "	";
new const opis[] = "	";
new const bronie = 1<<CSW_M4A1 | 1<<CSW_DEAGLE;
new const zdrowie = -20;
new const kondycja = -10;
new const inteligencja = 5;
new const wytrzymalosc = 10;

new bool:ma_klase[33];


public plugin_init() 
{
	cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);
	RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
	
}

public Odrodzenie(id)
{	
	if(task_exists(id + TASK_ZATRUCIE))
                remove_task(id + TASK_ZATRUCIE)
}

public TakeDamage(victim, ifinflictor, attacker, Float:damage, damagebits)
{
                
        if(!is_user_connected(attacker) || get_user_team(attacker) == get_user_team(victim))
                return HAM_IGNORED;
                
	if(ma_klase[attacker])
	{
		new szansa = 25 //Zmieniasz 25 na swoja liczbe (w procentach), czyli teraz jest 25
		if(random_num(1, 100) <= szansa)
	{
		Zatrucie(victim, 30.0);
	}
}
        
        return HAM_IGNORED;
}

public Zatrucie(id, Float:czas)
{
        new powtarzaj = floatround(czas / 5.0);
        set_task(5.0, "OdejmijHp", id+TASK_ZATRUCIE, _, _, "b", powtarzaj);
}

public OdejmijHP(id)
{
        id -= TASK_ZATRUCIE;
        fakedamage(id, "Zatrucie", 25.0, DMG_ACID)
}
Quote

  • +
  • -
sebul's Photo sebul 29.05.2011

Ten task coś źle chyba piszecie... Dokumentacja AMXX.pl: Core >> amxmodx > set_task
Chodzi mi o flagę "b" i te powtarzanie.
Edited by sebul, 29.05.2011 20:40.
Quote

  • +
  • -
Windowspl's Photo Windowspl 29.05.2011

chyba powinno być "a" ?
Quote

  • +
  • -
^Grzyboo's Photo ^Grzyboo 29.05.2011

A, rzeczywiście :D

Flaga "a" powinna być, pomyliło mi się



/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <hamsandwich>
#include <codmod>
#include <engine>

#define TASK_ZATRUCIE 555

new const perk_name[] = "Zatrute Naboje";
new const perk_desc[] = "1/4 szansy na zatrucie przeciwnika";

new bool:ma_perk[33];

public plugin_init()
{
register_plugin(perk_name, "1.0", "Noname");

cod_register_perk(perk_name, perk_desc);

RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
RegisterHam(Ham_Spawn, "player", "Odrodzenie", 1);
}

public Odrodzenie(id)
{
if(task_exists(id + TASK_ZATRUCIE))
remove_task(id + TASK_ZATRUCIE)
}
public cod_perk_enabled(id)
ma_perk[id] = true;

public cod_perk_disabled(id)
ma_perk[id] = false;


public TakeDamage(victim, ifinflictor, attacker, Float:damage, damagebits)
{

if(!is_user_connected(attacker) || get_user_team(attacker) == get_user_team(victim))
return HAM_IGNORED;

if(ma_perk[attacker])
{
new szansa = 25 //Zmieniasz 25 na swoja liczbe (w procentach), czyli teraz jest 25
if(random_num(1, 100) <= szansa)
{
Zatrucie(victim, 30.0);
}
}

return HAM_IGNORED;
}

public Zatrucie(id, Float:czas)
{
new powtarzaj = floatround(czas / 5.0);
set_task(5.0, "OdejmijHp", id+TASK_ZATRUCIE, _, _, "a", powtarzaj);
}

public OdejmijHP(id)
{
id -= TASK_ZATRUCIE;
fakedamage(id, "Zatrucie", 25.0, DMG_ACID)
}


Ten kod już dobry
Quote

  • +
  • -
Windowspl's Photo Windowspl 29.05.2011

Czyli taki kod na klasę będzie dobry ?

#include <amxmodx>
#include <hamsandwich>
#include <codmod>
#include <engine>

#define TASK_ZATRUCIE 555

new const nazwa[] = "	";
new const opis[] = "	";
new const bronie = 1<<CSW_M4A1 | 1<<CSW_DEAGLE;
new const zdrowie = -20;
new const kondycja = -10;
new const inteligencja = 5;
new const wytrzymalosc = 10;

new bool:ma_klase[33];


public plugin_init() 
{
	cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);
	RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
	RegisterHam(Ham_Spawn, "player", "Odrodzenie", 1);
	
}

public Odrodzenie(id)
{	
	if(task_exists(id + TASK_ZATRUCIE))
                remove_task(id + TASK_ZATRUCIE)
}

public TakeDamage(victim, ifinflictor, attacker, Float:damage, damagebits)
{
                
        if(!is_user_connected(attacker) || get_user_team(attacker) == get_user_team(victim))
                return HAM_IGNORED;
                
	if(ma_klase[attacker])
	{
		new szansa = 25 //Zmieniasz 25 na swoja liczbe (w procentach), czyli teraz jest 25
		if(random_num(1, 100) <= szansa)
	{
		Zatrucie(victim, 30.0);
	}
}
        
        return HAM_IGNORED;
}

public Zatrucie(id, Float:czas)
{
        new powtarzaj = floatround(czas / 5.0);
        set_task(5.0, "OdejmijHp", id+TASK_ZATRUCIE, _, _, "a", powtarzaj);
}

public OdejmijHP(id)
{
        id -= TASK_ZATRUCIE;
        fakedamage(id, "Zatrucie", 25.0, DMG_ACID)
}
Quote

  • +
  • -
^Grzyboo's Photo ^Grzyboo 29.05.2011

Brakuje tylko cod_class_enabled/disabled
Quote

  • +
  • -
Grandi's Photo Grandi 29.05.2011

Testowałem i niestety perk nie działa... Jednak za chęci dostaniesz plusa
Quote

  • +
  • -
Nomaf's Photo Nomaf 29.05.2011

Gdzie testowałeś? Na lanie z zBotami? To na pewno nie zadziała. zBoty nie mogą korzystać z hamsandwich. Musisz zainstalować PodBoty.
Quote

  • +
  • -
Windowspl's Photo Windowspl 30.05.2011

Która linijka odpowiada za to jak jest 1/4 ? Bo bym chciał ustawić 1/3
Quote
Locked