Dejw Napisano 19 Września 2019 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; } Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde Napisano 20 Września 2019 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? Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Dejw Napisano 20 Września 2019 (edytowane) 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 Edytowane 20 Września 2019 przez Dejw Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde Napisano 20 Września 2019 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" Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Dejw Napisano 20 Września 2019 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? Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 21 Września 2019 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 😁 Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde Napisano 9 Października 2019 @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ę Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Dejw Napisano 9 Października 2019 Problem rozwiązany 😉 Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Vasto_Lorde Napisano 10 Października 2019 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. Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach