[Release] Premium System - Source

10/12/2013 19:23 Selénc#1
Ich release jetzt das Premium System, nach langen Überlegungen ob ich es tuhe mache ich es, da es eh schon gefühlte 70 % der Server haben. Ich werde dies in einem kleinen Tutorial machen.



Dies ist das Premium System, es sollte funktionieren, wenn es Probleme gibt schreibt mir eine PN, ich bitte um KEIN geflame, nehmt es oder nicht.

Mit freundlichen Grüßen

Selénc
10/12/2013 21:29 Velmore#2
Quote:
#ifdef __PREMIUM
BOOL TextCmd_PremiumAwake( CScanner & s )
Warum einen Extra Befehl?

Quote:
BOOL TextCmd_PremiumBuff( CScanner& scanner )
{
#ifdef __WORLDSERVER

#include "defineSkill.h"
Das include gehört in den Kopf der Datei.

Quote:
if( pUser->HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM ) ||
pUser->HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM_2 ) ||
pUser->HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM_3 ) ||
pUser->HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM_4 ) )
{
Eine abfrage machen die direkt alle macht spart schreib arbeit.

Quote:
case IK3_EGG:
{} break;

default :
{
if( pItemElem->IsAccessory() )
pUser->UpdateItem( (BYTE)pItemElem->m_dwObjId, UI_AO, 20 );
Das sollte klar sein was nicht so gut gemacht ist. ( Das case IK3_EGG is unnötig. )

PS: Das ist kein geflame.
10/12/2013 23:22 FlyCraft.TobiLap#3
Velmore hat eig schon fast alles gesagt.
Eine kleinere Verbesserung währe noch dem Player die FUnktion "IsPremium()" hinzuzufügen , da du sehr oft folgende abfrage verwendest:
Quote:
if( pAttacker->HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM ) ||
pAttacker->HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM_2 ) ||
pAttacker->HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM_3 ) ||
pAttacker->HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM_4 ) )
könnte man in eine funktion packen:

Quote:
BOOL CUser::IsPremium(void)
{
return ( HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM ) ||
HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM_2 ) ||
HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM_3 ) ||
HasBuff( BUFF_ITEM, II_SYS_SYS_SCR_PREMIUM_4 ) );

}
und dann könnteste immer pUser->IsPremium() verwenden, würde dir copy & paste ersparen und das einfügen neuer premium items erleichtern.

MfG Tobi

ps: Code ist nicht getestet, soltle aber klappen :D
10/12/2013 23:34 Sedrika#4
Quote:
Originally Posted by FlyCraft.TobiLap View Post
Velmore hat eig schon fast alles gesagt.
Eine kleinere Verbesserung währe noch dem Player die FUnktion "IsPremium()" hinzuzufügen , da du sehr oft folgende abfrage verwendest:


könnte man in eine funktion packen:



und dann könnteste immer pUser->IsPremium() verwenden, würde dir copy & paste ersparen und das einfügen neuer premium items erleichtern.

MfG Tobi

ps: Code ist nicht getestet, soltle aber klappen :D
CMover statt CUser und es passt.
10/13/2013 00:19 FlyCraft.TobiLap#5
Quote:
Originally Posted by Sago​ View Post
CMover statt CUser und es passt.
Wozu? Wird doch nur bei CUser objekten aufgerufen oder irre ich mich da?
( denn entweder wird die abfrage verwendet bei userobjekten und wo mans nicht weiss, kommt hier im code immer eine pAttacker->IsPlayer() abfrage)
10/13/2013 04:18 Sedrika#6
Quote:
Originally Posted by FlyCraft.TobiLap View Post
Wozu? Wird doch nur bei CUser objekten aufgerufen oder irre ich mich da?
( denn entweder wird die abfrage verwendet bei userobjekten und wo mans nicht weiss, kommt hier im code immer eine pAttacker->IsPlayer() abfrage)
pAttacker ist cmover daher.
10/13/2013 06:57 h4rvswagg#7
SS Please?
10/13/2013 07:42 Rhyder`#8
Incomplete..
10/13/2013 12:18 FlyCraft.TobiLap#9
Quote:
Originally Posted by Sago​ View Post
pAttacker ist cmover daher.
pAttacker wird aber nur verwendet in dem Premiumzusammenhang wenn es ein CUser ist :)
10/13/2013 22:23 Sedrika#10
Quote:
Originally Posted by FlyCraft.TobiLap View Post
pAttacker wird aber nur verwendet in dem Premiumzusammenhang wenn es ein CUser ist :)
Wird allerdings in der MoverParam.cpp verwendet und ist daher auch CMover!
Du kannst dich nicht ins Rechte zwingen wo kein platz ist.
10/13/2013 23:01 FlyCraft.TobiLap#11
Quote:
Originally Posted by Sago​ View Post
Wird allerdings in der MoverParam.cpp verwendet und ist daher auch CMover!
Du kannst dich nicht ins Rechte zwingen wo kein platz ist.
Samma chekcste das nicht? nur weils da verwendet wird heisst es nicht dass es ein Mover ist junge alter.
jedes mal wenns verwendet wird, falls du dir mal das releaste angeguckt hast wird abgefragt obs ein CUser ist....
10/13/2013 23:26 Мentus#12
Ihr habt beide unrecht.

Jedoch finde ich Sago's Aussage mit den Aldishit nice :'D.

Jetzt gehen wir in den Source, und schauen uns an wieso das was Tobilap geposted hat überhaupt funktionieren würde.


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

Ja genau! CUser hat Zugriff auf CMover, umgekehrt nicht. ( man kann CMover zu CUser casten, aber sollte man nicht tun, wenn man keine Ahnung hat. )

CMover ist auch für NPC genutzt, damit werden wirklich alle Mover "gekennzeichet". ( Client/WS )

Jedoch ist die CUser Klasse nur für den WorldServer gedacht, und dient zum Verwalten der Nutzer im WorldServer. ( Gibt natürlich auch noch in anderen Projekten die Klasse CUser, jedoch nicht mit Zugriff auf CMover mit anderen Verwendungszwecken. )


Jetzt schauen wir uns mal die Member der Klasse CUser an:

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

Dort sehen wir schon, Ticks, hmmmm.
Dient wie oben genannt nur der Verwaltung, zum Beispiel von Cooldowns und so weiter.

Jedoch gibt es noch Funktionen, schauen wir uns diese mal an:

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

Wie ihr sehen könnt, wird in diesen Funktionen großteils nur der Client updated oder auch um irgendwelche Meldungen anzeigen zu lassen oder Ähnliches.
Halt alles rund um das (WorldServer->Client) Verhältniss findet ihr dort.


Es ist scheiß egal, ob CMover oder CUser im WorldServer.
Jedoch ist es unnötig ein CUser zu nutzen wenn man eh in der Klasse CMover arbeitet.

z.B:

PHP Code:
#ifdef __WORLDSERVER
BOOL CMover::IsVip()
{
    
CUserpUser g_UserMng.GetUserByPlayerIDm_idPlayer );
    if( 
IsValidObjpUser ) && pUser->HasBuffBLAID ) )
        return 
TRUE;
    return 
FALSE;
}
#endif 
Das ist unnötig, da wir die Funktionen von CUser garnicht nutzen wollen.

Also reicht es:
PHP Code:
#ifdef __WORLDSERVER
BOOL CMover::IsVip()
{
    if( 
this->HasBuffBLAID ) )
        return 
TRUE;
    return 
FALSE;
}
#endif 
Man die vorgegebene Struktur schon verwenden und es bei CMover belassen, da die Funktionen von CUser garnicht gebraucht werden. ( wie bereits erwähnt )

.. und ob nun pAttacker ein CMover oder CUser ist, kann man nur anhand des Quellcode's feststellen.

Die Variable könnte theoretisch auch "pKakaPisseausmeinemArsch" heißen, das sagt NULL über den Klassen-Typen aus.

PHP Code:
CMoverpAttacker prj.GetMoverobjid ); 
PHP Code:
CUserpAttacker g_UserMng.GetUserByPlayerIDidPlayer ); 

BTW;
@ Tobilap
PHP Code:
float CMover::GetPieceItemDropRateFactorCMoverpAttacker 
Wieso CUser verwenden, wenn bereits eh CMover vorgeben ist? Man müsste dann sogar casten*, was nicht gerade zu empfehlen ist wegen einer solchen Abfrage.


@TE
Das Premium System ist nicht das Wahre, ich habe es z.B bei meinem Premium System die Zeiten extra in der Datenbank speichern lassen.



casten* = [Only registered and activated users can see links. Click Here To Register...]
10/13/2013 23:29 FlyCraft.TobiLap#13
Quote:
Originally Posted by Мentus View Post
Ihr habt beide unrecht.

Jedoch finde ich Sago's Aussage mit den Aldishit nice :'D.

Jetzt gehen wir in den Source, und schauen uns an wieso das was Tobilap geposted hat überhaupt funktionieren würde.


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

Ja genau! CUser hat Zugriff auf CMover, umgekehrt nicht. ( man kann CMover zu CUser casten, aber sollte man nicht tun, wenn man keine Ahnung hat. )

CMover ist auch für NPC genutzt, damit werden wirklich alle Mover "gekennzeichet". ( Client/WS )

Jedoch ist die CUser Klasse nur für den WorldServer gedacht, und dient zum Verwalten der Nutzer im WorldServer. ( Gibt natürlich auch noch in anderen Projekten die Klasse CUser, jedoch nicht mit Zugriff auf CMover mit anderen Verwendungszwecken. )


Jetzt schauen wir uns mal die Member der Klasse CUser an:

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

Dort sehen wir schon, Ticks, hmmmm.
Dient wie oben genannt nur der Verwaltung, zum Beispiel von Cooldowns und so weiter.

Jedoch gibt es noch Funktionen, schauen wir uns diese mal an:

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

Wie ihr sehen könnt, wird in diesen Funktionen großteils nur der Client updated oder auch um irgendwelche Meldungen anzeigen zu lassen oder Ähnliches.
Halt alles rund um das (WorldServer->Client) Verhältniss findet ihr dort.


Es ist scheiß egal, ob CMover oder CUser im WorldServer.
Jedoch ist es unnötig ein CUser zu nutzen wenn man eh in der Klasse CMover arbeitet.

z.B:

PHP Code:
#ifdef __WORLDSERVER
BOOL CMover::IsVip()
{
    
CUserpUser g_UserMng.GetUserByPlayerIDm_idPlayer );
    if( 
IsValidObjpUser ) && pUser->HasBuffBLAID ) )
        return 
TRUE;
    return 
FALSE;
}
#endif 
Das ist unnötig, da wir die Funktionen von CUser garnicht nutzen wollen.

Also reicht es:
PHP Code:
#ifdef __WORLDSERVER
BOOL CMover::IsVip()
{
    if( 
this->HasBuffBLAID ) )
        return 
TRUE;
    return 
FALSE;
}
#endif 
Man die vorgegebene Struktur schon verwenden und es bei CMover belassen, da die Funktionen von CUser garnicht gebraucht werden. ( wie bereits erwähnt )

.. und ob nun pAttacker ein CMover oder CUser ist, kann man nur anhand des Quellcode's feststellen.

Die Variable könnte theoretisch auch "pKakaPisseausmeinemArsch" heißen, das sagt NULL über den Klassen-Typen aus.

PHP Code:
CMoverpAttacker prj.GetMoverobjid ); 
PHP Code:
CUserpAttacker g_UserMng.GetUserByPlayerIDidPlayer ); 

BTW;
@ Tobilap
PHP Code:
float CMover::GetPieceItemDropRateFactorCMoverpAttacker 
Wieso CUser verwenden, wenn bereits eh CMover vorgeben ist? Man müsste dann sogar casten, was nicht gerade zu empfehlen ist wegen einer solchen Abfrage.


@TE
Das Premium System ist nicht das Wahre, ich habe es z.B bei meinem Premium System die Zeiten extra in der Datenbank speichern lassen.
Die erste intelligente aussave von mentus die ich gehört habe :D

@mentus jo das premium hier ist einfach nur bullshit und kann sogar bis auf das renderen des namens per resource gemacht werden xD
10/27/2013 23:17 Simon©#14
Wie verlängert man die Zeit von 10sec auf sag ich mal 14 und 28 Tage?
11/01/2013 20:52 Swäg#15
Quote:
Originally Posted by Simon© View Post
Wie verlängert man die Zeit von 10sec auf sag ich mal 14 und 28 Tage?
Geh in Spec_item.txt bzw. PropItem.txt in die zeile der Premium Scroll und scroll so weit rüber bis du "10000" findest.
Die zahl änderst du nun zu 604800000 für 7 tage.
1209600000 = 14 tage. usw.

Die angabe ist immer in Milli Sec.
1000 = 1 Sec



@Topic:

Finde das nett das du es released und mit uns teilst, jedoch was ich persönlich unnötig finde ist das mit den Commands, die könnte man noch ein bisschen besser ausbauen was das angeht.

Genauso finde ich könnte eine geringere cooldown zeit der dungeons für premium User ganz nett sein.

Aber auch -25% weniger Penya kosten bei den NPC's bzw. +25% mehr Penya beim verkauf an NPC's währen sicher cool.

Sowie vielleicht eine geringere Shout limitierung für Premium User, z.b. 10 Shouts pro Minute anstatt die üblichen 5.

Auch coole features währen, größere Bags/Bank, sowie zugang zur Bank überall per command oder am besten ein kleines Menü speziell für Premium User (Ähnlich wie das Lord Menü).