[Release] Funktionierendes Buff Tool

02/11/2013 15:49 Sabage#1

Hallo Epvper's,
wie der Betreff schon sagt Release ich hier mal ein funktionerendes Buff Tool.

1. Was es Macht:
Es Bufft euren Char mit den von euch gewählten Buffs

[Only registered and activated users can see links. Click Here To Register...]

2.Code
für /buff braucht ihr nur User.h Ctrl.cpp/h und /buff aus 3.
für die Fensterversion bitte alles hier einfügen.

User.h
Code:
sucht nach
public:
	virtual void	Process();

und fürgt darüber ein
	DWORD m_dwBuffTick;
Ctrl.cpp
am Ende
Code:
void CCtrl::DoBuff( DWORD dwSkill, int nLevel, CCtrl *pTarget)
{
	ItemProp* pSkillProp;
	AddSkillProp* pAddSkillProp;
	GetSkillProp( &pSkillProp, &pAddSkillProp, dwSkill, nLevel, "DoActiveSkill" );
	if(	pAddSkillProp->dwSkillTime > 1000)
		pAddSkillProp->dwSkillTime = 3600000;

	 DoApplySkill( pTarget, pSkillProp, pAddSkillProp, 0, 0, FALSE, 0 );
 #ifdef __WORLDSERVER		
		g_UserMng.AddDoApplySkill( this, pTarget->GetId(), dwSkill, nLevel );
 #endif
}
Ctrl.h
Code:
sucht nach 
D3DXMATRIX*		GetInvTM()				{ return &m_mInvTM; }

und fügt darunter ein
	void			DoBuff( DWORD dwSkill, int nLevel, CCtrl *pTarget);
DPClient.cpp
Am Ende über CDPClient g_DPlay;
Code:
void CDPClient::SendBuffRequest( u_long idPlayer )
{
	BEFORESENDSOLE( ar, PACKETTYPE_BUFFREQUEST, DPID_UNKNOWN );
	ar << idPlayer;
	SEND( ar, this, DPID_SERVERPLAYER );
}
DPClient.h

Code:
sucht nach

//________________________________________________________________________________
//	Operator commands

und fügt [U]DARÜBER[/U] ein

	void SendBuffRequest( u_long idPlayer );
DPSrvr.cpp
Code:
sucht nach 
}

CDPSrvr::~CDPSrvr()
{

und fügt Darüber ein, bei den anderen ON_MSG(...

	ON_MSG( PACKETTYPE_BUFFREQUEST, OnSendBuffRequest );
Code:
Am Ende von DPSrvr.cpp

void CDPSrvr::OnSendBuffRequest( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long )
{
	CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
	u_long idPlayer;

	if( IsValidObj( pUser ) )
	{
		ar >> idPlayer;
		if( idPlayer != pUser->m_idPlayer )
			return;

		if( pUser->m_dwBuffTick + 5000 > GetTickCount() )
		{
			pUser->AddText("Bitte Warte einen Moment!");
			return;
		}
		else
		{
			pUser->DoBuff( SI_ASS_CHEER_HEAPUP, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_QUICKSTEP, 15,  pUser); 
			pUser->DoBuff( SI_ASS_HEAL_PATIENCE, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_CATSREFLEX, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_CANNONBALL, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_MENTALSIGN, 15,  pUser);
			pUser->DoBuff( SI_ASS_CHEER_BEEFUP, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_ACCURACY, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_HASTE, 15,  pUser);
			pUser->AddText("Du hast Buffs Lvl 15 erhalten!");
			pUser->m_dwBuffTick = GetTickCount();

		}
	}
}
pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_HASTE, 15, 3600000);

BUFF_SKILL für Buff
SI_ASS_CHEER_HASTE euer Buff den der User bekommen soll
15 das Skill Level
3600000 Zeit in Millisecunden

DPSrvr.h
Code:
Am Ende über
private:
	DPID	m_dpidCache;		// ij½¬¼*¹ö DPID
};


#endif // __DPSRVR_H__

kommt

	void OnSendBuffRequest( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long );
MsgHdr.h
Code:
#define PACKETTYPE_BUFFREQUEST				       (DWORD)0x88100265

sucht am bessten nach #define SNAPSHOTTYPE_ und fügt es über 
/*------------------------------------------------------------------------------------------------------------------------------------------------------------*/
ein
3.Möglicher Aufruf
Man kann es so wie ich in eine ListBox packen oder über einen Button
machen das bleibt euch überlassen.
Wichtig ist nur das ihr bei OnChildNotify

Code:
	g_DPlay.SendBuffRequest(g_pPlayer->m_idPlayer);
die Stelle einfügt
bei meiner ListBox sieht das dann so aus
Code:
	case 6:
	{
		g_DPlay.SendBuffRequest(g_pPlayer->m_idPlayer);
		break;
	}
für einen Button wäre es
Code:
	if( nID == WIDC_BUTTON1 )
	{
		g_DPlay.SendBuffRequest(g_pPlayer->m_idPlayer);
		Destroy(); //Wenn das Fester sich schließen soll
	}

Über den Befehl /buff
Wichtig denkt an User.h aus 2.


in der FuncTextCmd.cpp sucht ihr nach

BEGINE_TEXTCMDFUNC_MAP

Darüber addet ihr
Code:
BOOL TextCmd_Buff( CScanner& scanner )       
{ 
#ifdef __WORLDSERVER

	#include "defineSkill.h"
	CUser* pUser = (CUser*)scanner.dwValue;
	if( IsValidObj( pUser ) )
	{
		if( pUser->m_dwBuffTick + 5000 > GetTickCount() )
		{
			pUser->AddText("Bitte Warte einen Moment!");
			return FALSE;
		}
		else
		{
			pUser->DoBuff( SI_ASS_CHEER_HEAPUP, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_QUICKSTEP, 15,  pUser); 
			pUser->DoBuff( SI_ASS_HEAL_PATIENCE, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_CATSREFLEX, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_CANNONBALL, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_MENTALSIGN, 15,  pUser);
			pUser->DoBuff( SI_ASS_CHEER_BEEFUP, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_ACCURACY, 15,  pUser); 
			pUser->DoBuff( SI_ASS_CHEER_HASTE, 15,  pUser);
			pUser->AddText("Du hast Buffs Lvl 15 erhalten!");
			pUser->m_dwBuffTick = GetTickCount();
		}
	}
#endif //WORLDSERVER
	return TRUE;
}
und darunter bei den Spielern
Code:
	ON_TEXTCMDFUNC( TextCmd_Buff,     "Buff",     "buff",     "",       "",    TCM_SERVER, AUTH_GENERAL      , "" )
02/11/2013 15:51 .Tear#2
Fenster wäre nice wenn man jeden BUff einzeln auswählen könnte ^^ So is das nur umständliche Klickarbeit, darum lieber '/buff' ^^
02/11/2013 16:04 Sabage#3
gut /buff wär auch ne möglichkeit das aufzurufen werd ich vllt noch hinzugügen und jeden buff einzeln wählen find ich jetzt persönlich zuviel klickarbeit wär aber auch möglich wären nur kleine änderungen am Code
02/11/2013 16:22 Jopsi332#4
eine abfrage ob der user bereits denn buff hat / fast abgelaufen ist wäre gut, da man sonst dauern buffen könnte und alles anfängt zu laggen.
02/11/2013 17:00 TrøublêMakêr#5
Tu doch 5 Sek Timer rein. Dann laggt es gar nicht.
02/11/2013 17:40 Sabage#6
habs mal edited ist jetzt der 5 sec Timer drin und der /buff
02/11/2013 18:37 Cartmanforlife#7
Hallo,
habe das versucht bei mir einzubauen, mit dem /buff den rest hab ich mal gelassen also hab ich nur änderungen in der FuncTextCmd.cpp vorgenommen.

Dort hab ich die Funktion reingebaut das man gebufft werden kann und das der Befehl ausgeführt werden kann, beim Compilen des World Servers un der Neuz kam der Error das m_dwBuffTick oder so kein Member von pUser ist, dann hab ich die Abfrage der 5 Sekunden rausgenommen. Jetzt hat er richtig compiled, allerdings hats ingame nich gefunzt, aber er hat auch nich /buff in den chat geschrieben, also nimmt er den command ja an, nur gebufft werd ich nicht, villeicht solle ich dazu schreiben das ich v15 clean source benutze und wenn ich pUser-> eingebe kommt ja intellisence, da steht AddBuff auch garnit drin, also gibts das ja garnicht... könnt ihr mir helfen?

Edit: Meine Bearbeitete Funktion sah danach so aus:
Code:
BOOL TextCmd_Buff( CScanner& scanner )       
{ 
#ifdef __WORLDSERVER

	#include "defineSkill.h"
	CUser* pUser = (CUser*)scanner.dwValue;
	if( IsValidObj( pUser ) )
	{
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_HEAPUP, 15, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_QUICKSTEP, 15, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_HEAL_PATIENCE, 15, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_CATSREFLEX, 15, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_CANNONBALL, 15, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_MENTALSIGN, 15, 3600000);
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_BEEFUP, 15, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_ACCURACY, 15, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_HASTE, 15, 3600000); 
			pUser->AddText("Du hast Buffs erhalten!");
	}
#endif //WORLDSERVER
	return TRUE;
}
Also nur drie Abfrage mit den 5 Sekunden rausgeholt.
02/11/2013 18:48 Sabage#8
ich habs sowohl mit RoC als auch offiV15 selber versucht
wegen m_dwBuffTick schau mal unter 2. da steht für /buff nur den eintrag User.h machen rest kannst du auslassen

was genau hast du da rausgelöscht?
02/11/2013 18:57 Cartmanforlife#9
Ich hab das rausgelöscht:

Code:
if( pUser->m_dwBuffTick + 5000 > GetTickCount() )
		{
			pUser->AddText("Bitte Warte einen Moment!");
			return FALSE;
		}
		else
		{
                    WAS HIER STAND HAB ICH STEHGELASSEN ALSO DAS BUFFEN
                } //UND DAS CLOSE Tag "}" HAB ICH AUCH WEG GEMACHT.
Edit: Kannst du mir mal deine V15 Offi FuncTextCmd.cpp hochladen?
Edit²: Danke sehr, compile gerade...
Edit³: Danke sehr, funktioniert jetzt super.
02/12/2013 15:59 MilKa*#10
Möchte gerne so haben das /buff Geld kostet reicht es wenn ich in der Funktion der Functextcmd.cpp int nCost = 450000; hintuhe?
02/12/2013 16:36 Sabage#11
versuchs mal mit
pUser->AddGold( -450000 );
einfach unter
pUser->AddText("Bitte Warte einen Moment!");
oder drüber einfügen

du solltest aber nen check einbauen ob der User soviel geld hat
02/12/2013 19:13 Cartmanforlife#12
Diese /buff Funktion (ob die andere auch, weiß ich nicht) ist jedenfalls verbuggt, habe ich eben leider erfahren müssen, ich war in der PVP Arena, bin gestorben, habe /buff gemacht, buffs bekommen, bin gestorben, wollte meine stats editieren und mir ist aufgefallen das alle bis auf dex (ich hab dex geskillt) auf 1 waren und rot gefärbt waren, und jedesmal wenn ich /buff mache und danach sterbe und wieder /buff mache, passiert das ganze...

Edit: Die Idee mit dem Geld bezahlen fand ich auch nice, hab ich direkt umgesetzt:

Code:
BOOL TextCmd_Buff( CScanner& scanner )       
{ 
#ifdef __WORLDSERVER

	#include "defineSkill.h"
	CUser* pUser = (CUser*)scanner.dwValue;
	if( IsValidObj( pUser ) )
	{

		int iBuffCost = 5000000; //Das sind die Kosten zum Buffen.

		if (pUser->GetGold() >= iBuffCost)
		{
			pUser->AddGold( -iBuffCost );
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_HEAPUP, 20, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_QUICKSTEP, 20, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_HEAL_PATIENCE, 20, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_CATSREFLEX, 20, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_CANNONBALL, 20, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_MENTALSIGN, 20, 3600000);
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_BEEFUP, 20, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_ACCURACY, 20, 3600000); 
			pUser->AddBuff(BUFF_SKILL, SI_ASS_CHEER_HASTE, 20, 3600000);
			pUser->AddBuff(BUFF_SKILL, SI_RIN_SUP_SPIRITUREFORTUNE, 10, 3600000);
			pUser->AddBuff(BUFF_SKILL, SI_RIN_SUP_HOLYGUARD, 10, 3600000);
			pUser->AddBuff(BUFF_SKILL, SI_RIN_SUP_PROTECT, 10, 3600000);
			pUser->AddText("Du hast dich erfolgreich gebufft.");
		} else {
			pUser->AddText("Du hast nicht genügend Penya.");
		}
	}
#endif //WORLDSERVER
	return TRUE;
}
Viel Spaß damit ;)
PS: Bei mir funktioniert es so einwandfrei...
02/12/2013 22:08 Sabage#13
hab mir das mal genauer angesehn und etwas umgeschrieben werd gleich editieren

so also habs bei mir schon getestet problem beim alten war er hat zwar die skills angezeigt aber die stats erst nach relog angenommen mit dem neuen befehl nimmt er die jetzt sofort
02/12/2013 22:29 Cartmanforlife#14
Also nur die Ctrl.cpp und Ctrl.h jetzt umschreiben und statt AddBuff DoBuff?

Gut werde ich morgen mal probieren.