Jump to content
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
Dejw

[Rozwiązane] Problem z klasą - nie działa ładowanie na nożu

Recommended Posts

Witam.

 

Problem polega na tym, że chciałem dodać ładowanie umiejętności na nożu.

Zrobiłem test. Hud się wyświetla ale po wykonaniu ifa który sprawdza czy funkcja rozpoznaje kiedy mam w ręku nóż a kiedy nie dała odpowiedz: przy nożu w ręku na czacie wypisała "tak natomiast przy trzymaniu broni nie wypisała nic prawdopodobnie tam leży problem. Jeżeli ktoś zna odpowiedź to proszę o szybką pomoc.

Spoiler

#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#include <codmod>

#define PANCERZ_ILOSC 4
#define BAR_LENGTH 10

char nazwy_broni[][] =
{
	"weapon_glock", "weapon_usp_silencer", "weapon_hkp2000", "weapon_p250", "weapon_tec9", "weapon_fiveseven", "weapon_cz75a", "weapon_deagle",
	"weapon_revolver", "weapon_elite", "weapon_m4a1_silencer", "weapon_ak47", "weapon_awp", "weapon_m4a1", "weapon_negev", "weapon_famas",
	"weapon_aug", "weapon_p90", "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_mac10", "weapon_mp7", "weapon_mp9", "weapon_bizon",
	"weapon_ump45", "weapon_galilar", "weapon_ssg08", "weapon_sg556", "weapon_m249", "weapon_scar20", "weapon_g3sg1", "weapon_sawedoff"
};

int naboje_broni[][2] =
{
	{20, 120}, {12, 24}, {13, 52}, {13, 26}, {32, 120}, {20, 100}, {12, 12}, {7, 35}, {8, 8}, {30, 120}, {20, 40}, {30, 90}, {10, 30}, {30, 90}, {150, 200}, {25, 90}, {30, 90},
	{50, 100}, {8, 32}, {7, 32}, {5, 32}, {30, 100}, {30, 120}, {30, 120}, {64, 120}, {25, 100}, {35, 90}, {10, 90}, {30, 90}, {100, 200}, {20, 90}, {20, 90}, {7, 32}
};

char nazwa[] = "Barbarzyńca";
char opis[] = "*Na starcie posiada 125, Moze naladowac magiczny pancerz, Dostaje HP, armor i ammo zabijajac wroga, Po naladowaniu noza dostaje +1 magiczny pancerz";
const int inteligencja = 0;
const int zdrowie = 25;
const int obrazenia = 0;
const int wytrzymalosc = 20;
const int kondycja = 0;

int magicznyPancerz[MAXPLAYERS];
int pancerzLeft[MAXPLAYERS];
int timeLeft[MAXPLAYERS];
bool czyLadujePancerz[MAXPLAYERS];
Handle pancerzTimer[MAXPLAYERS] = {INVALID_HANDLE};
bool trzymaNoz[MAXPLAYERS];
bool nieRuszaSie[MAXPLAYERS];

new bool: ma_klase[65];
public Plugin: myinfo = {
  name = nazwa,
  author = "Linux`",
  description = "Cod Klasa",
  version = "1.0",
  url = "http://steamcommunity.com/id/linux2006"
};

public void OnPluginStart() {
  cod_register_class(nazwa, opis, "", inteligencja, zdrowie, obrazenia, wytrzymalosc, kondycja);
  HookEvent("player_death", SmiercGracza);
  HookEvent("player_spawn", OdrodzenieGracza);
  //RegConsoleCmd("testhud", SprawdzHud);
}

public Action OdrodzenieGracza(Handle event, char[] name, bool dontbroadcast) {
    int client = GetClientOfUserId(GetEventInt(event, "userid"));

    pancerzLeft[client] = PANCERZ_ILOSC;
    ClearPlayer(client);
}

public void OnClientPutInServer(int client) {
  SDKHook(client, SDKHook_WeaponSwitchPost, OnWeaponSwitch);
  SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public void OnClientDisconnect(int client) {
  SDKUnhook(client, SDKHook_WeaponSwitchPost, OnWeaponSwitch);
  SDKUnhook(client, SDKHook_OnTakeDamage, OnTakeDamage);

}

public Action OnTakeDamage(int client, int & attacker, int & inflictor, float & damage, int & damagetype) {
  if (magicznyPancerz[client] > 0) {
    magicznyPancerz[client]--;
    // SDKHooks_TakeDamage(attacker, victim, victim, damage, DMG_GENERIC, weapon);
    damage = 0.0;
    return Plugin_Changed;
  }
  return Plugin_Continue;
}

public Action OnWeaponSwitch(int client, int weapon) {
    int weaponSlot = GetPlayerWeaponSlot(client, 2);

    trzymaNoz[client] = (weaponSlot == weapon);

    Sprawdz(client);
}

void Sprawdz(int client) {
    if (trzymaNoz[client] && nieRuszaSie[client]) {
        if (!czyLadujePancerz[client] && pancerzLeft[client] > 0) {
            czyLadujePancerz[client] = true;
            timeLeft[client] = BAR_LENGTH;
            pancerzTimer[client] = CreateTimer(PlayerLoadTime(client), BarLoad, GetClientOfUserId(client), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
        }
    }
    else {
        if (pancerzTimer[client] != INVALID_HANDLE) {
            KillTimer(pancerzTimer[client]);
            pancerzTimer[client] = INVALID_HANDLE;
            czyLadujePancerz[client] = false;
        }
    }
}

float PlayerLoadTime(int client) {
    return (10.0-float(cod_get_user_maks_intelligence(client))*0.01)/float(BAR_LENGTH);
}

/*public Action SprawdzHud(int client, int args) {

  if (!trzymaNoz[client]) {
        
        PrintToChat(client, "NIE");
  }    
  else {
        PrintToChat(client, "TAK");
  }
        
}*/

public Action BarLoad(Handle timer, int clientUserId) {
    int client = GetClientOfUserId(clientUserId);
    if (!client) {
        ClearPlayer(client);
        return Plugin_Stop;
    }

    DisplayHudTimer(client, BAR_LENGTH-timeLeft[client], BAR_LENGTH, PlayerLoadTime(client), 255, 0, 0);
    timeLeft[client]--;
    if (timeLeft[client] == 0) {
        magicznyPancerz[client]++;
        pancerzLeft[client]--;
        czyLadujePancerz[client] = false;
        SetHudTextParamsEx(-1.0, 0.4, 1.0, { 0, 255, 0, 255 }); // #FFFF00
        ShowHudText(client, 2, "Magiczny pancerz: %d", magicznyPancerz[client]);
        pancerzTimer[client] = INVALID_HANDLE;
        return Plugin_Stop;
    }
    return Plugin_Continue;
}

void ClearPlayer(int client) {
    magicznyPancerz[client] = 0;
    pancerzLeft[client] = PANCERZ_ILOSC;
    czyLadujePancerz[client] = false;
    pancerzTimer[client] = INVALID_HANDLE;
}

//[| | | |      ]
void DisplayHudTimer(int client, int tick, int maxTick, float time, int r, int g, int b, channel=2) {
    char buffer[128];


    Format(buffer, sizeof(buffer), "Ładowanie pancerza...\n[");

    for (int i = 0; i < tick; i++)
        StrCat(buffer, sizeof(buffer), "|");
    for (int i = 0; i < maxTick-tick; i++)
        StrCat(buffer, sizeof(buffer), "  ");
    StrCat(buffer, sizeof(buffer), "]");

    SetHudTextParams(-1.0, 0.4, time, r, g, b, 255);
    ShowHudText(client, channel, buffer);
}

public cod_class_enabled(client) {
  ma_klase[client] = true;
}
public cod_class_disabled(client) {
  ma_klase[client] = false;
}

public Action SmiercGracza(Handle event, char[] name, bool dontbroadcast) {
  new client = GetClientOfUserId(GetEventInt(event, "userid"));
  new killer = GetClientOfUserId(GetEventInt(event, "attacker"));
  if (!IsValidClient(killer) || !ma_klase[killer])
    return Plugin_Continue;

  if (!IsValidClient(client) || !IsPlayerAlive(killer))
    return Plugin_Continue;

  if (GetClientTeam(client) == GetClientTeam(killer))
    return Plugin_Continue;

  new active_weapon = GetEntPropEnt(killer, Prop_Send, "m_hActiveWeapon");
  if (active_weapon != -1) {
    new String: weapon[32];
    GetClientWeapon(killer, weapon, sizeof(weapon));
    for (int i = 0; i < sizeof(nazwy_broni); i++) {
      if (StrEqual(weapon, nazwy_broni[i])) {
        SetEntData(active_weapon, FindSendPropInfo("CWeaponCSBase", "m_iClip1"), naboje_broni[i][0]);
        break;
      }
    }
  }

  new zdrowie_gracza = GetClientHealth(killer);
  new maksymalne_zdrowie = cod_get_user_maks_health(killer);
  SetEntData(killer, FindDataMapInfo(killer, "m_iHealth"), (zdrowie_gracza + 20 < maksymalne_zdrowie) ? zdrowie_gracza + 20 : maksymalne_zdrowie);

  return Plugin_Continue;
}

public Action OnPlayerRunCmd(int client, int & buttons, int & impulse, float vel[3], float angles[3], int & weapon, int & subtype, int & cmdnum, int & tickcount, int & seed, int mouse[2]) {
    if (buttons & (IN_FORWARD|IN_BACK|IN_LEFT|IN_RIGHT|IN_JUMP))
        nieRuszaSie[client] = false;
    else
        nieRuszaSie[client] = true;

    Sprawdz(client);

    return Plugin_Continue;
}

 

 

Share this post


Link to post
Share on other sites

O ile dobrze zrozumiałem, to chodzi o to, że kod:

  if (!trzymaNoz[client]) {
        
        PrintToChat(client, "NIE");
  }    
  else {
        PrintToChat(client, "TAK");
  }

Przy trzymaniu noża wyświetla TAK, a przy trzymaniu czegoś innego nic nie wyświetla. Jest to niemożliwe, gdyż wyświetla albo to albo to, nie ma prawa nic nie wyświetlać. Ten kod się wykonuje po użyciu komendy "testhud", więc musisz za każdym razem wpisywać tę komendę żeby coś wyświetliło.

 

Z tego jak czytam kod, wydaje się być poprawny, ale po kolei dla upewnienia się wypiszę kroki jakie robi plugin:

-Jeśli gracz stoi w miejscu i wyciągnie nóż, to uaktywnia się moc ładowania

-Za X sekund (PlayerLoadTime) zacznie się ładować moc, powtarzać się będzie Z razy

-Za każdym Z razem będzie wyświetlany inny HUD z coraz pełniejszym progress barem

-Po Z razach moc jest aktywowana

 

Więc gdzie zatrzymuje się plugin/co nie działa?

Share this post


Link to post
Share on other sites

wszystko się zgadza if testowy już również podaje obie odpowiedzi! 😄

 

Tak działanie pluginu tak wygląda ale plugin sam w sobie po prostu nie działa

 

Jest klasa ma tyle życia ile powinna mieć kondycję itd.. ale samo łądowanie na nożu nie działa.

Zrobiłem testową komentę która dawała po wpisaniu na czacie jeden magiczny pancerz i sprawdziłem hudem czy go przyznało.. i tak przyznało go ale na nożu nie da się naładować hud zwiazany z ładowaniem po prostu się nie odpala nie łąduje na tym nożu

Edited by Dejw

Share this post


Link to post
Share on other sites

1. Sprawdź czy w logach nie ma errorów

2. Wyświetlaj sobie na czacie wiadomości w czasie działania pluginu, na przykład w na początku i końcu funkcji BarLoad, wtedy będziesz wiedział gdzie plugin się "zacina"

Share this post


Link to post
Share on other sites
Spoiler

#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#include <codmod>

#define PANCERZ_ILOSC 4
#define BAR_LENGTH 10

char nazwy_broni[][] =
{
	"weapon_glock", "weapon_usp_silencer", "weapon_hkp2000", "weapon_p250", "weapon_tec9", "weapon_fiveseven", "weapon_cz75a", "weapon_deagle",
	"weapon_revolver", "weapon_elite", "weapon_m4a1_silencer", "weapon_ak47", "weapon_awp", "weapon_m4a1", "weapon_negev", "weapon_famas",
	"weapon_aug", "weapon_p90", "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_mac10", "weapon_mp7", "weapon_mp9", "weapon_bizon",
	"weapon_ump45", "weapon_galilar", "weapon_ssg08", "weapon_sg556", "weapon_m249", "weapon_scar20", "weapon_g3sg1", "weapon_sawedoff"
};

int naboje_broni[][2] =
{
	{20, 120}, {12, 24}, {13, 52}, {13, 26}, {32, 120}, {20, 100}, {12, 12}, {7, 35}, {8, 8}, {30, 120}, {20, 40}, {30, 90}, {10, 30}, {30, 90}, {150, 200}, {25, 90}, {30, 90},
	{50, 100}, {8, 32}, {7, 32}, {5, 32}, {30, 100}, {30, 120}, {30, 120}, {64, 120}, {25, 100}, {35, 90}, {10, 90}, {30, 90}, {100, 200}, {20, 90}, {20, 90}, {7, 32}
};

char nazwa[] = "Barbarzyńca";
char opis[] = "*Na starcie posiada 125, Moze naladowac magiczny pancerz, Dostaje HP, armor i ammo zabijajac wroga, Po naladowaniu noza dostaje +1 magiczny pancerz";
const int inteligencja = 0;
const int zdrowie = 25;
const int obrazenia = 0;
const int wytrzymalosc = 20;
const int kondycja = 0;

int magicznyPancerz[MAXPLAYERS];
int pancerzLeft[MAXPLAYERS];
int timeLeft[MAXPLAYERS];
bool czyLadujePancerz[MAXPLAYERS];
Handle pancerzTimer[MAXPLAYERS] = {INVALID_HANDLE};
bool trzymaNoz[MAXPLAYERS];
bool nieRuszaSie[MAXPLAYERS];

new bool: ma_klase[65];
public Plugin: myinfo = {
  name = nazwa,
  author = "Linux`",
  description = "Cod Klasa",
  version = "1.0",
  url = "http://steamcommunity.com/id/linux2006"
};

public void OnPluginStart() {
  cod_register_class(nazwa, opis, "", inteligencja, zdrowie, obrazenia, wytrzymalosc, kondycja);
  HookEvent("player_death", SmiercGracza);
  HookEvent("player_spawn", OdrodzenieGracza);
  RegConsoleCmd("testhud", SprawdzHud);
  RegConsoleCmd("testhudd", SprawdzHudd);
}

public Action OdrodzenieGracza(Handle event, char[] name, bool dontbroadcast) {
    int client = GetClientOfUserId(GetEventInt(event, "userid"));

    pancerzLeft[client] = PANCERZ_ILOSC;
    ClearPlayer(client);
}

public void OnClientPutInServer(int client) {
  SDKHook(client, SDKHook_WeaponSwitchPost, OnWeaponSwitch);
  SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public void OnClientDisconnect(int client) {
  SDKUnhook(client, SDKHook_WeaponSwitchPost, OnWeaponSwitch);
  SDKUnhook(client, SDKHook_OnTakeDamage, OnTakeDamage);

}

public Action OnTakeDamage(int client, int & attacker, int & inflictor, float & damage, int & damagetype) {
  if (magicznyPancerz[client] > 0) {
    magicznyPancerz[client]--;
    // SDKHooks_TakeDamage(attacker, victim, victim, damage, DMG_GENERIC, weapon);
    damage = 0.0;
    return Plugin_Changed;
  }
  return Plugin_Continue;
}

public Action OnWeaponSwitch(int client, int weapon) {
    int weaponSlot = GetPlayerWeaponSlot(client, 2);

    trzymaNoz[client] = (weaponSlot == weapon);

    Sprawdz(client);
}

void Sprawdz(int client) {
    if (trzymaNoz[client] && nieRuszaSie[client]) {
        if (!czyLadujePancerz[client] && pancerzLeft[client] > 0) {
            czyLadujePancerz[client] = true;
            timeLeft[client] = BAR_LENGTH;
            pancerzTimer[client] = CreateTimer(PlayerLoadTime(client), BarLoad, GetClientOfUserId(client), TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
        }
    }
    else {
        if (pancerzTimer[client] != INVALID_HANDLE) {
            KillTimer(pancerzTimer[client]);
            pancerzTimer[client] = INVALID_HANDLE;
            czyLadujePancerz[client] = false;
        }
    }
}

float PlayerLoadTime(int client) {
    return (10.0-float(cod_get_user_maks_intelligence(client))*0.01)/float(BAR_LENGTH);
}

public Action SprawdzHud(int client, int args) {

  if (!trzymaNoz[client]) {
        
        PrintToChat(client, "NIE");
  }    
  else {
        PrintToChat(client, "TAK");
        magicznyPancerz[client]++;
  }
}

  public Action SprawdzHudd(int client, int args) {

        SetHudTextParamsEx(-1.0, 0.4, 1.0, { 0, 255, 0, 255 }); // #FFFF00
        ShowHudText(client, 2, "Magiczny pancerz: %d", magicznyPancerz[client]);
}

public Action BarLoad(Handle timer, int clientUserId) {
    int client = GetClientOfUserId(clientUserId);
    if (!client) {
        ClearPlayer(client);
        return Plugin_Stop;
    }

    DisplayHudTimer(client, BAR_LENGTH-timeLeft[client], BAR_LENGTH, PlayerLoadTime(client), 255, 0, 0);
    timeLeft[client]--;
    if (timeLeft[client] == 0) {
        magicznyPancerz[client]++;
        pancerzLeft[client]--;
        czyLadujePancerz[client] = false;
        SetHudTextParamsEx(-1.0, 0.4, 1.0, { 0, 255, 0, 255 }); // #FFFF00
        ShowHudText(client, 2, "Magiczny pancerz: %d", magicznyPancerz[client]);
        pancerzTimer[client] = INVALID_HANDLE;
        return Plugin_Stop;
    }
    return Plugin_Continue;
}

void ClearPlayer(int client) {
    magicznyPancerz[client] = 0;
    pancerzLeft[client] = PANCERZ_ILOSC;
    czyLadujePancerz[client] = false;
    pancerzTimer[client] = INVALID_HANDLE;
}

//[| | | |      ]
void DisplayHudTimer(int client, int tick, int maxTick, float time, int r, int g, int b, channel=2) {
    char buffer[128];


    Format(buffer, sizeof(buffer), "Ładowanie pancerza...\n[");

    for (int i = 0; i < tick; i++)
        StrCat(buffer, sizeof(buffer), "|");
    for (int i = 0; i < maxTick-tick; i++)
        StrCat(buffer, sizeof(buffer), "  ");
    StrCat(buffer, sizeof(buffer), "]");

    SetHudTextParams(-1.0, 0.4, time, r, g, b, 255);
    ShowHudText(client, channel, buffer);
}

public cod_class_enabled(client) {
  ma_klase[client] = true;
}
public cod_class_disabled(client) {
  ma_klase[client] = false;
}

public Action SmiercGracza(Handle event, char[] name, bool dontbroadcast) {
  new client = GetClientOfUserId(GetEventInt(event, "userid"));
  new killer = GetClientOfUserId(GetEventInt(event, "attacker"));
  if (!IsValidClient(killer) || !ma_klase[killer])
    return Plugin_Continue;

  if (!IsValidClient(client) || !IsPlayerAlive(killer))
    return Plugin_Continue;

  if (GetClientTeam(client) == GetClientTeam(killer))
    return Plugin_Continue;

  new active_weapon = GetEntPropEnt(killer, Prop_Send, "m_hActiveWeapon");
  if (active_weapon != -1) {
    new String: weapon[32];
    GetClientWeapon(killer, weapon, sizeof(weapon));
    for (int i = 0; i < sizeof(nazwy_broni); i++) {
      if (StrEqual(weapon, nazwy_broni[i])) {
        SetEntData(active_weapon, FindSendPropInfo("CWeaponCSBase", "m_iClip1"), naboje_broni[i][0]);
        break;
      }
    }
  }

  new zdrowie_gracza = GetClientHealth(killer);
  new maksymalne_zdrowie = cod_get_user_maks_health(killer);
  SetEntData(killer, FindDataMapInfo(killer, "m_iHealth"), (zdrowie_gracza + 20 < maksymalne_zdrowie) ? zdrowie_gracza + 20 : maksymalne_zdrowie);

  return Plugin_Continue;
}

public Action OnPlayerRunCmd(int client, int & buttons, int & impulse, float vel[3], float angles[3], int & weapon, int & subtype, int & cmdnum, int & tickcount, int & seed, int mouse[2]) {
    if (buttons & (IN_FORWARD|IN_BACK|IN_LEFT|IN_RIGHT|IN_JUMP))
        nieRuszaSie[client] = false;
    else
        nieRuszaSie[client] = true;

    Sprawdz(client);

    return Plugin_Continue;
}

 

okej z tym kodem wykrywa mi czy jest nóż czy broń dodaje mi pancerz nie ładuje tylko samego noża nie ma animacji ładowania no i w efekcie końcowym przyznania punktu. Wszystkie inne mechanizmy chodzą tylko nie timer który ma odpowiadać za przyznanie punktów? Ktoś pomoże to poprawić żeby smigało?

Share this post


Link to post
Share on other sites

Raczej nikt nie poprawi "żeby śmigało", bo ciężko to oczami skompilować

 

Zbadaj ktore ify w funkcji Sprawdz() wchodzą. Czy w ogóle ten timer sie odpala - czy w ogóle sama funkcja sie odpala. Duuużo ifów 😁

Share this post


Link to post
Share on other sites

@Dejw czy problem został rozwiązany? Jeśli nie, to polecam rozwiązanie Magneta - dużo ifów oraz dużo printów na czacie - stąd będziesz wiedział w którym momencie plugin dokładnie się zatrzymuje, bo jak na razie znasz tylko funkcję w której się zatrzymuje a nie konkretną linijkę

Share this post


Link to post
Share on other sites

Wiadomość wygenerowana automatycznie

 

Temat został zamknięty. Powodem jest całkowite rozwiązanie problemu zawartego w temacie.

 

Jeśli się z tym nie zgadzasz, zaraportuj ten post z prośbą o ponowne otwarcie i kontynuację dyskusji.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

Nasza historia

Na początku byliśmy małą grupą internetowych znajomych, którzy stwierdzili, że potrzebne jest solidne forum, na którym znajdą się ludzie z dużą wiedzą programistyczną ukierunkowaną na CS:GO. Pomysł powstał na początku 2018 roku, a parę miesięcy później, 19 kwietnia, powstała ta strona internetowa. Jako alternatywna odpowiedź na inne tego typu miejsca, poważnie podeszliśmy do tematu, najpierw tłumacząc angielską dokumentację SourceMod'a na język polski, a potem pisząc rozległe poradniki i wypełniając forum najpotrzebniejszymi rzeczami dla właścicieli serwerów i programistów. Cała nasza Ekipa jest dumna z pracy jaką w to włożyliśmy i cieszymy się że zbierają się wokół nas zarówno ludzie znający tematy sourcepawn'a i konfiguracji, jak i również nowe twarze w tym "biznesie", którym z chęcią niesiemy wiedzę oraz pomoc w rozwiązywaniu problemów.

Największe modyfikacje serwerowe

×
×
  • Create New...