Jump to content
assignment_ind Existing user? Sign In

Sign In



person_add Sign Up
Go-Code.pl - Support SourceMod i Pluginy CS:GO
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

Problem rozwiązany 😉

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.


O NAS Jesteśmy społecznością łączącą ludzi, którzy dzielą pasję poznawania CS:GO od strony programistycznej. Posiadamy duże zaplecze merytoryczne i zawsze cieszymy się, gdy dołączają do nas osoby gotowe do nauki. Gwarantujemy, że z odrobiną wytrwałości i otwartym umysłem bardzo szybko napiszesz swój pierwszy plugin. Zapraszamy! 🙂
Szablon wykonany z dużą ilością przez cyberpixelz / Mesharsky / Sitefuture
Forum dumnie napędzane przez: Invision Power Services, Inc.
×
×
  • Create New...