Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

TakeDamage_Pre - sprawdzenie funkcji


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
5 odpowiedzi w tym temacie

#1 DEADP00L

    Profesjonalista

  • Użytkownik

Reputacja: 212
Profesjonalista

  • Postów:169
  • Steam:steam
  • Imię:Bart
  • Lokalizacja:United Kingdom
Offline

Napisano 28.05.2023 17:23

Witam,

 

Chciałbym zapoznać się z waszymi opiniami czy według was jest to stabilna forma zmiany obrażeń poszczególnej broni:

#define IsPlayer(%1) (1 <= %1 <= g_iMaxPlayers)
new g_iMaxPlayers;

new const Float:hit_area[][] = {
    { 1.0,   1.0,   1.0    },  // HIT_GENERIC
    { 50.0,  10.0,  30.0   },  // HIT_HEAD
    { 25.0,  8.0,   15.0   },  // HIT_CHEST
    { 20.25, 6.25,  12.25  },  // HIT_STOMACH
    { 10.0,  4.0,   8.0    },  // HIT_LEFTARM
    { 10.0,  4.0,   8.0    },  // HIT_RIGHTARM
    { 8.75,  2.75,  5.75   },  // HIT_LEFTLEG
    { 8.75,  2.75,  5.75   },  // HIT_RIGHTLEG
    { 0.0,   0.0,   0.0    }   // HIT_SHIELD
}

public plugin_init() {
    RegisterHam(Ham_TakeDamage, "player", "Ham_CBasePlayer_TakeDamage_Pre", 0);
    g_iMaxPlayers = get_maxplayers();
}

public Ham_CBasePlayer_TakeDamage_Pre(id, iInflictor, iAttacker, Float:flDamage, bitsDamageType) {
    if(id != iAttacker && is_user_connected(iAttacker) && IsPlayer(iAttacker)) {
        const XTRA_OFS_PLAYER = 5; const m_LastHitGroup = 75; const m_iTeam = 114;
        new weapon = get_user_weapon(iAttacker), hitbox = get_pdata_int(id, m_LastHitGroup, XTRA_OFS_PLAYER);

        switch(weapon) {
            case CSW_KNIFE: if(bitsDamageType & DMG_BULLET && get_pdata_int(id, m_iTeam, XTRA_OFS_PLAYER) != get_pdata_int(iAttacker, m_iTeam, XTRA_OFS_PLAYER)) SetHamParamFloat(4, hit_area[hitbox][0])         
            case CSW_FIVESEVEN: if(bitsDamageType & DMG_BULLET && get_pdata_int(id, m_iTeam, XTRA_OFS_PLAYER) != get_pdata_int(iAttacker, m_iTeam, XTRA_OFS_PLAYER)) SetHamParamFloat(4, hit_area[hitbox][1])
            case CSW_M4A1: if(bitsDamageType & DMG_BULLET && get_pdata_int(id, m_iTeam, XTRA_OFS_PLAYER) != get_pdata_int(iAttacker, m_iTeam, XTRA_OFS_PLAYER)) SetHamParamFloat(4, hit_area[hitbox][2])          
        }
        return HAM_OVERRIDE 
    }
    return HAM_IGNORED
}

Dodam, że łącznie będzie tam 24 case'ów z każdą bronią ;)

Czy według was jest to dobrze zoptymalizowane?

 

 

Z góry dziękuję za wszelkie sugestie!


  • +
  • -
  • 0

#2 Robiin

    Godlike

  • Support Team

Reputacja: 1 107
Super Hero

  • Postów:2 050
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 28.05.2023 19:04

Czym są te floaty w hit_area?

Generalnie zamiast robić switcha to pewnie dałoby radę zrobić to z jednym ifem:

if(bitsDamageType & DMG_BULLET && get_pdata_int(id, m_iTeam, XTRA_OFS_PLAYER) != get_pdata_int(iAttacker, m_iTeam, XTRA_OFS_PLAYER))
    SetHamParamFloat(4, hit_area[hitbox][id_based_on_weapon_id]);

Zakładając, że id_based_on_weapon_id będzie jakoś sensownie wyznaczany.

No i jeszcze kwestia HE, bo tam pewnie jest DMG_* inne, więc nie złapałby go if.


  • +
  • -
  • 1

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#3 DEADP00L

    Profesjonalista

  • Autor tematu
  • Użytkownik

Reputacja: 212
Profesjonalista

  • Postów:169
  • Steam:steam
  • Imię:Bart
  • Lokalizacja:United Kingdom
Offline

Napisano 28.05.2023 20:28


Czym są te floaty w hit_area?

 

Obrażenia w zależności od tego czy trafiliśmy w głowe, klate, noge itp

 

Dałem tam przykład pod 3 bronie, FiveSeven, M4A1 oraz Knife


  • +
  • -
  • 0

#4 DEADP00L

    Profesjonalista

  • Autor tematu
  • Użytkownik

Reputacja: 212
Profesjonalista

  • Postów:169
  • Steam:steam
  • Imię:Bart
  • Lokalizacja:United Kingdom
Offline

Napisano 28.05.2023 21:02

Czym są te floaty w hit_area?

Generalnie zamiast robić switcha to pewnie dałoby radę zrobić to z jednym ifem:

if(bitsDamageType & DMG_BULLET && get_pdata_int(id, m_iTeam, XTRA_OFS_PLAYER) != get_pdata_int(iAttacker, m_iTeam, XTRA_OFS_PLAYER))
    SetHamParamFloat(4, hit_area[hitbox][id_based_on_weapon_id]);

Zakładając, że id_based_on_weapon_id będzie jakoś sensownie wyznaczany.

No i jeszcze kwestia HE, bo tam pewnie jest DMG_* inne, więc nie złapałby go if.

 

Zrobiłem to w taki sposób, tak jak napisałeś wyżej:

#define IsPlayer(%1) (1 <= %1 <= g_iMaxPlayers)
new g_iMaxPlayers;

new const Float:hit_area[][] = {
    // 0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22    23   24   25   26   27   28   29    30
    { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, 0.0 },  // HIT_GENERIC
    { 0.0, 5.0, 0.0, 5.0, 0.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 20.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 10.0, 5.0 },  // HIT_HEAD
    { 0.0, 5.0, 0.0, 5.0, 0.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0,  5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 10.0, 5.0 },  // HIT_CHEST
    { 0.0, 5.0, 0.0, 5.0, 0.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0,  5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 10.0, 5.0 },  // HIT_STOMACH
    { 0.0, 5.0, 0.0, 5.0, 0.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0,  5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 10.0, 5.0 },  // HIT_LEFTARM
    { 0.0, 5.0, 0.0, 5.0, 0.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0,  5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 10.0, 5.0 },  // HIT_RIGHTARM
    { 0.0, 5.0, 0.0, 5.0, 0.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0,  5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 10.0, 5.0 },  // HIT_LEFTLEG
    { 0.0, 5.0, 0.0, 5.0, 0.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0,  5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 10.0, 5.0 },  // HIT_RIGHTLEG
    { 0.0, 5.0, 0.0, 5.0, 0.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0,  5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 10.0, 5.0 }   // HIT_SHIELD
}

public plugin_init() {
    RegisterHam(Ham_TakeDamage, "player", "Ham_CBasePlayer_TakeDamage_Pre", 0);
    g_iMaxPlayers = get_maxplayers();
}

public Ham_CBasePlayer_TakeDamage_Pre(id, iInflictor, iAttacker, Float:flDamage, bitsDamageType) {
    if(id != iAttacker && IsPlayer(iAttacker)) {
        const XTRA_OFS_PLAYER = 5; const m_LastHitGroup = 75; const m_iTeam = 114;
        new wid, weapon = GetUserWeapon(iAttacker,wid), hitbox = get_pdata_int(id, m_LastHitGroup, XTRA_OFS_PLAYER);

        if(bitsDamageType & DMG_BULLET && get_pdata_int(id, m_iTeam, XTRA_OFS_PLAYER) != get_pdata_int(iAttacker, m_iTeam, XTRA_OFS_PLAYER))
            SetHamParamFloat(4, hit_area[hitbox][weapon]);

        return HAM_OVERRIDE 
    }
    return HAM_IGNORED
}

GetUserWeapon(id,&wid=0) {
	const m_pActiveItem = 373
	const m_iId = 43
	if(!is_user_alive(id) || pev_valid((wid = get_pdata_cbase(id,m_pActiveItem,5))) != 2)	return 0
	
	return get_pdata_int(wid,m_iId,4)
}

Ponumerowałem sobie ID broni od 0 do 30, tak abym potem wiedział w której broni zmieniam DMG. 

 

Co do *HE_, to to akurat nie będzie mi potrzebne dlatego ustawiłem przy każdym granacie float 0.0, tak samo jak i przy C4. 

Ten plugin jest uruchomiony na Zombie Modzie, gdzie nie ma standardowych granatów wybuchających tylko podpalających. 

 

Daj znać czy teraz plugin jest bardziej zoptymalizowany ;)


  • +
  • -
  • 0

#5 Robiin

    Godlike

  • Support Team

Reputacja: 1 107
Super Hero

  • Postów:2 050
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 30.05.2023 15:57

Proponowałbym zrobić jakiś config do tego. Przykładowy syntax:

m4a1:
    head: 50.0
    generic: 25.0
    chest: 20.0
    stomach: 20.0
    left_arm: 15.0
    right_arm: 15.0
    left_leg: 15.0
    right_leg: 15.0
    shield: 0.0

I potem względem tego wybierać damage. W ten sposób masz ładną i przejrzystą konfigurację i nie musisz rekompilować pluginu za każdym razem kiedy chcesz zmienić którąś z wartości.

Dodatkowo, jeśli używasz amxxa >= 1.9, to IsPlayer może użyć stałej dostępnej we wszystkich pluginach, które używają include "amxmodx" (czyli w praktycznie każdym); MAX_PLAYERS:

#define IsPlayer(%1) (1 <= %1 <= MAX_PLAYERS)

Reszta wygląda solidnie, ale już nie pamiętam kiedy ostatni raz pisałem coś w amxxie, więc mogę po prostu krzywo patrzeć


  • +
  • -
  • 2

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#6 Hard D'RING

    Początkujący

  • Użytkownik

Reputacja: 4
Nowy

  • Postów:15
Offline

Napisano 05.06.2023 20:42

if(id != iAttacker && IsPlayer(iAttacker))

zamień na 

if(id != iAttacker && IsPlayer(iAttacker) && bitsDamageType & DMG_BULLET && get_pdata_int(id, m_iTeam, XTRA_OFS_PLAYER) != get_pdata_int(iAttacker, m_iTeam, XTRA_OFS_PLAYER))

będzie optymalniej :) 


  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych