PDA

View Full Version : PVP Permadeath Concept (W/ Support for Guild-Owned Doors & Guild-Owned NPCs in perl)


Secrets
09-27-2010, 10:57 AM
This is all of what I did for my permadeath PVP server. It goes against Revision 1668 of the EQEmu code.

It does the features posted in my server's thread, and adds support for guild-owned doors + guild-owned NPCs, a-la guildwars. It also has the ability to check which guild owns a door or NPC with perl or IsAttackAllowed accordingly.

The implementation could've been better for doors, but I figure DB calls are not going to be expensive as long as you don't call them too much.

If someone is interested in just the guild-owned doors and NPCs (or the attack code without that support) let me know.


Index: aggro.cpp
================================================== =================
--- aggro.cpp (revision 1668)
+++ aggro.cpp (working copy)
@@ -41,7 +41,11 @@
Mob* mob = iterator.GetData();
if(mob->IsClient()) //also ensures that mob != around
continue;
+
+ if(mob && mob->IsNPC() && mob->CastToNPC()->GetGuildID() == around->GuildID())
+ continue;

+
if(mob->CheckWillAggro(around)) {
if(mob->IsEngaged())
{
@@ -256,6 +260,18 @@
if(ownr && ownr->IsClient() && !ownr->CastToClient()->ClientFinishedLoading())
return false;

+ if(mob->IsNPC() && IsNPC())
+ {
+ if(CastToNPC()->GetGuildID() != 0 && mob->CastToNPC()->GetGuildID() != 0)
+ {
+ if(CastToNPC()->GetGuildID() == mob->CastToNPC()->GetGuildID())
+ {
+ return false;
+ }
+ }
+ }
+ return false;
+
float iAggroRange = GetAggroRange();

// Check If it's invisible and if we can see invis
@@ -499,7 +515,7 @@
{
Mob *mob1, *mob2, *tempmob;
Client *c1, *c2, *becomenpc;
-// NPC *npc1, *npc2;
+ NPC *npc1, *npc2;
int reverse;

if(!zone->CanDoCombat())
@@ -551,26 +567,31 @@
{
c1 = mob1->CastToClient();
c2 = mob2->CastToClient();
-
- if // if both are pvp they can fight
- (
- c1->GetPVP() &&
- c2->GetPVP()
- )
+
+ if(zone->GetZoneID() == 1)
+ return false;
+
+ if(c1->GuildID() != 0xFFFFFFFF && c2->GuildID() != 0xFFFFFFFF)
+ {
+ if(c1->GuildID() == c2->GuildID())
+ return false;
+ }
+ if(c1->GetGroup() && c2->GetGroup())
+ {
+ if(c1->GetGroup()->GetID() == c2->GetGroup()->GetID())
+ return false;
+ else
+ return true;
+ }
return true;
- else if // if they're dueling they can go at it
- (
- c1->IsDueling() &&
- c2->IsDueling() &&
- c1->GetDuelTarget() == c2->GetID() &&
- c2->GetDuelTarget() == c1->GetID()
- )
- return true;
- else
- return false;
}
else if(_NPC(mob2)) // client vs npc
{
+ c1 = mob1->CastToClient();
+ npc1 = mob2->CastToNPC();
+
+ if(npc1->GetGuildID() == c1->GuildID())
+ return false;
return true;
}
else if(_BECOMENPC(mob2)) // client vs becomenpc
@@ -596,7 +617,17 @@
{
if(_NPC(mob2)) // npc vs npc
{
-/*
+
+ npc1 = mob1->CastToNPC();
+ npc2 = mob2->CastToNPC();
+
+
+ if(npc1->GetGuildID() != 4294967295 && npc2->GetGuildID() != 4294967295)
+ {
+ if(npc1->GetGuildID() == npc2->GetGuildID())
+ return false;
+ }
+ /*
this says that an NPC can NEVER attack a faction ally...
this is stupid... somebody else should check this rule if they want to
enforce it, this just says 'can they possibly fight based on their
@@ -693,6 +724,7 @@
{
Mob *mob1, *mob2, *tempmob;
Client *c1, *c2;
+ NPC *npc1, *npc2;
int reverse;

if(!target)
@@ -719,23 +751,41 @@
c1 = mob1->CastToClient();
c2 = mob2->CastToClient();

- if(c1->GetPVP() == c2->GetPVP())
+
+ if(zone->GetZoneID() == 1)
+ return true;
+
+
+ if(c1->GuildID() != 0xFFFFFFFF && c2->GuildID() != 0xFFFFFFFF)
+ {
+ if(c1->GuildID() == c2->GuildID())
return true;
- else if // if they're dueling they can heal each other too
- (
- c1->IsDueling() &&
- c2->IsDueling() &&
- c1->GetDuelTarget() == c2->GetID() &&
- c2->GetDuelTarget() == c1->GetID()
- )
- return true;
- else
+ }
+
+ if(c1->GetGroup() && c2->GetGroup())
+ {
+ if(c1->GetGroup()->GetID() != c2->GetGroup()->GetID())
+ return false;
+ else
+ return true;
+ }
+
+
return false;
}
else if(_NPC(mob2)) // client to npc
{
- /* fall through and swap positions */
+ c1 = mob1->CastToClient();
+ npc2 = mob2->CastToNPC();
+
+ if(npc2->GetGuildID() != 0 && c1->GuildID() != 0)
+ {
+ if(npc2->GetGuildID() == c1->GuildID())
+ return true;
}
+ return false;
+
+ }
else if(_BECOMENPC(mob2)) // client to becomenpc
{
return false;
@@ -757,11 +807,24 @@
{
if(_CLIENT(mob2))
{
+
+ npc1 = mob1->CastToNPC();
+ c2 = mob2->CastToClient();
+ if(npc1->GetGuildID() != 0 && c2->GuildID() != 0)
+ {
+ if(c2->GuildID() == npc1->GetGuildID())
+ return true;
+ }
+
return false;
}
if(_NPC(mob2)) // npc to npc
{
- return true;
+ npc1 = mob1->CastToNPC();
+ npc2 = mob2->CastToNPC();
+ if(npc1->GetGuildID() == npc2->GetGuildID())
+ return true;
+ return false;
}
else if(_BECOMENPC(mob2)) // npc to becomenpc
{
Index: attack.cpp
================================================== =================
--- attack.cpp (revision 1668)
+++ attack.cpp (working copy)
@@ -1206,11 +1206,6 @@
int min_hit = 1;
int max_hit = (2*weapon_damage*GetDamageTable(skillinuse)) / 100;

- if(GetLevel() < 10 && max_hit > 20)
- max_hit = 20;
- else if(GetLevel() < 20 && max_hit > 40)
- max_hit = 40;
-
CheckIncreaseSkill(skillinuse, other, -15);
CheckIncreaseSkill(OFFENSE, other, -15);

@@ -1534,65 +1529,9 @@
// #3: exp loss and corpse generation
//

- // figure out if they should lose exp
- if(RuleB(Character, UseDeathExpLossMult)){
- float GetNum [] = {0.005f,0.015f,0.025f,0.035f,0.045f,0.055f,0.065f, 0.075f,0.085f,0.095f,0.110f };
- int Num = RuleI(Character, DeathExpLossMultiplier);
- if((Num < 0) || (Num > 10))
- Num = 3;
- float loss = GetNum[Num];
- exploss=(int)((float)GetEXP() * (loss)); //loose % of total XP pending rule (choose 0-10)
- }

- if(!RuleB(Character, UseDeathExpLossMult)){
- exploss = (int)(GetLevel() * (GetLevel() / 18.0) * 12000);
- }
-
- if( (GetLevel() < RuleI(Character, DeathExpLossLevel)) || (GetLevel() > RuleI(Character, DeathExpLossMaxLevel)) || IsBecomeNPC() )
- {
- exploss = 0;
- }
- else if( killerMob )
- {
- if( killerMob->IsClient() )
- {
- exploss = 0;
- }
- else if( killerMob->GetOwner() && killerMob->GetOwner()->IsClient() )
- {
- exploss = 0;
- }
- }
-
- if(spell != SPELL_UNKNOWN)
- {
- uint32 buff_count = GetMaxTotalSlots();
- for(uint16 buffIt = 0; buffIt < buff_count; buffIt++)
- {
- if(buffs[buffIt].spellid == spell && buffs[buffIt].client)
- {
- exploss = 0; // no exp loss for pvp dot
- break;
- }
- }
- }
-
- // now we apply the exp loss, unmem their spells, and make a corpse
- // unless they're a GM (or less than lvl 10
- if(!GetGM())
- {
- if(exploss > 0) {
- sint32 newexp = GetEXP();
- if(exploss > newexp) {
- //lost more than we have... wtf..
- newexp = 1;
- } else {
- newexp -= exploss;
- }
- SetEXP(newexp, GetAAXP());
- //m_epp.perAA = 0; //reset to no AA exp on death.
- }
-
+ SetLevel(1);
+ SetEXP(0,0);
//this generates a lot of 'updates' to the client that the client does not need
BuffFadeAll();
UnmemSpellAll(false);
@@ -1600,7 +1539,7 @@
if(RuleB(Character, LeaveCorpses) && GetLevel() >= RuleI(Character, DeathItemLossLevel) || RuleB(Character, LeaveNakedCorpses))
{
// creating the corpse takes the cash/items off the player too
- Corpse *new_corpse = new Corpse(this, exploss);
+ Corpse *new_corpse = new Corpse(this, 0);

char tmp[20];
database.GetVariable("ServerType", tmp, 9);
@@ -1644,46 +1583,11 @@

// if(!IsLD())//Todo: make it so an LDed client leaves corpse if its enabled
// MakeCorpse(exploss);
- } else {
- BuffFadeDetrimental();
- }
+



-#if 0 // solar: commenting this out for now TODO reimplement becomenpc stuff
- if (IsBecomeNPC() == true)
- {
- if (killerMob != NULL && killerMob->IsClient()) {
- if (killerMob->CastToClient()->isgrouped && entity_list.GetGroupByMob(killerMob) != 0)
- entity_list.GetGroupByMob(killerMob->CastToClient())->SplitExp((uint32)(level*level*75*3.5f), this);

- else
- killerMob->CastToClient()->AddEXP((uint32)(level*level*75*3.5f)); // Pyro: Comment this if NPC death crashes zone
- //hate_list.DoFactionHits(GetNPCFactionID());
- }
-
- Corpse* corpse = new Corpse(this->CastToClient(), 0);
- entity_list.AddCorpse(corpse, this->GetID());
- this->SetID(0);
- if(killerMob->GetOwner() != 0 && killerMob->GetOwner()->IsClient())
- killerMob = killerMob->GetOwner();
- if(killerMob != 0 && killerMob->IsClient()) {
- corpse->AllowMobLoot(killerMob, 0);
- if(killerMob->CastToClient()->isgrouped) {
- Group* group = entity_list.GetGroupByClient(killerMob->CastToClient());
- if(group != 0) {
- for(int i=0; i < MAX_GROUP_MEMBERS; i++) { // Doesnt work right, needs work
- if(group->members[i] != NULL) {
- corpse->AllowMobLoot(group->members[i],i);
- }
- }
- }
- }
- }
- }
-#endif
-
-
//
// Finally, send em home
//
@@ -1692,9 +1596,9 @@
// from these and overwrite what we set in pp anyway
//

- m_pp.zone_id = m_pp.binds[0].zoneId;
+ m_pp.zone_id = 1;
m_pp.zoneInstance = 0;
- database.MoveCharacterToZone(this->CharacterID(), database.GetZoneName(m_pp.zone_id));
+ database.MoveCharacterToZone(this->CharacterID(), database.GetZoneName(1));

Save();

Index: bot.cpp
================================================== =================
--- bot.cpp (revision 1668)
+++ bot.cpp (working copy)
@@ -759,7 +759,10 @@

void Bot::GenerateArmorClass() {
// Base AC
- int bac = GetAC();
+ if(_baseAC)
+ int bac = _baseAC;
+ else
+ _baseAC = 0;
switch(this->GetClass()) {
case WARRIOR:
case SHADOWKNIGHT:
@@ -8841,6 +8844,7 @@
CHA += spellbonuses.CHA;
ATK += spellbonuses.ATK;

+
cur_hp = CalcMaxHP();
GenerateBaseManaPoints();

Index: bot.h
================================================== =================
--- bot.h (revision 1668)
+++ bot.h (working copy)
@@ -322,7 +322,7 @@
sint16 _baseDR;
sint16 _baseFR;
sint16 _basePR;
- int _baseAC;
+ int16 _baseAC;
sint16 _baseSTR;
sint16 _baseSTA;
sint16 _baseDEX;
Index: client_packet.cpp
================================================== =================
--- client_packet.cpp (revision 1668)
+++ client_packet.cpp (working copy)
@@ -3546,6 +3546,13 @@
return;
}

+ if(ent_corpse->IsLocked())
+ {
+ Message(13, "A player is already looting this corpse.");
+ Corpse::SendLootReqErrorPacket(this);
+ return;
+ }
+
if(invisible) {
BuffFadeByEffect(SE_Invisibility);
BuffFadeByEffect(SE_Invisibility2);
@@ -8816,7 +8823,7 @@
//enforce some rules..
if(!CanBeInZone()) {
_log(CLIENT__ERROR, "Kicking char from zone, not allowed here");
- GoToSafeCoords(database.GetZoneID("arena"), 0);
+ GoToSafeCoords(database.GetZoneID("qeynos"), 0);
return;
}

@@ -9103,6 +9110,8 @@

void Client::Handle_OP_RaidCommand(const EQApplicationPacket *app)
{
+
+ return;
DumpPacket(app);

RaidGeneral_Struct *ri = (RaidGeneral_Struct*)app->pBuffer;
Index: doors.cpp
================================================== =================
--- doors.cpp (revision 1668)
+++ doors.cpp (working copy)
@@ -34,6 +34,7 @@

extern EntityList entity_list;
extern WorldServer worldserver;
+extern Zone* zone;

Doors::Doors(const Door* door)
: close_timer(5000)
@@ -600,3 +601,8 @@
}
return true;
}
+
+void Doors::SetGuildID(int32 guild_id) {
+ guild_id = guild_id;
+ database.SetGuildDoor(GetDoorID(), guild_id, zone->GetShortName());
+}
\ No newline at end of file
Index: doors.h
================================================== =================
--- doors.h (revision 1668)
+++ doors.h (working copy)
@@ -9,6 +9,7 @@
#include "mob.h"
#include "zonedump.h"

+
class Doors : public Entity
{
public:
@@ -40,7 +41,7 @@
int8 GetNoKeyring() { return nokeyring; }
int16 GetLockpick() { return lockpick; }
int16 GetSize() { return size; }
- void SetGuildID(int32 guild_id) { guild_id = guild_id; }
+ void SetGuildID(int32 guild_id);

int32 GetEntityID() { return entity_id; }
void SetEntityID(int32 entity) { entity_id = entity; }
Index: entity.cpp
================================================== =================
--- entity.cpp (revision 1668)
+++ entity.cpp (working copy)
@@ -4420,6 +4420,23 @@
}
}

+Doors* EntityList::GetDoorByDoorID(int8 id) {
+ LinkedListIterator<Doors*> iterator(door_list);
+
+ iterator.Reset();
+ while(iterator.MoreElements())
+ {
+ if (iterator.GetData())
+ {
+ if (iterator.GetData()->GetDoorID() == id) {
+ return iterator.GetData();
+ }
+ }
+ iterator.Advance();
+ }
+ return 0;
+}
+
void EntityList::GetNPCList(list<NPC*> &n_list)
{
n_list.clear();
Index: entity.h
================================================== =================
--- entity.h (revision 1668)
+++ entity.h (working copy)
@@ -148,6 +148,7 @@
Raid* GetRaidByClient(Client* client);
Raid* GetRaidByID(int32 id);
Raid* GetRaidByLeaderName(const char *leader);
+ Doors* GetDoorByDoorID(int8 doorid);

Corpse* GetCorpseByOwner(Client* client);
Corpse* GetCorpseByID(int16 id);
Index: guild.cpp
================================================== =================
--- guild.cpp (revision 1668)
+++ guild.cpp (working copy)
@@ -431,3 +431,22 @@
return(affected_rows > 0);
}

+bool ZoneDatabase::SetGuildNPC(int32 npc_type ,int16 guild_id) {
+ char errbuf[MYSQL_ERRMSG_SIZE];
+ char *query = 0;
+ int32 affected_rows = 0;
+
+ if (!RunQuery(query, MakeAnyLenString(&query,
+ "UPDATE npc_types SET guildid = %i WHERE id = %i",
+ guild_id, npc_type), errbuf, 0,&affected_rows))
+ {
+ LogFile->write(EQEMuLog::Error, "Error in SetGuildNPC query '%s': %s", query, errbuf);
+ safe_delete_array(query);
+ return false;
+ }
+
+ safe_delete_array(query);
+
+ return(affected_rows > 0);
+}
+
Index: npc.cpp
================================================== =================
--- npc.cpp (revision 1668)
+++ npc.cpp (working copy)
@@ -347,6 +347,7 @@
guard_y_saved = 0;
guard_z_saved = 0;
guard_heading_saved = 0;
+ guildid = d->guildid;
InitializeBuffSlots();
}

Index: npc.h
================================================== =================
--- npc.h (revision 1668)
+++ npc.h (working copy)
@@ -286,6 +286,9 @@

bool IsLDoNLocked() const { return (ldon_locked); }
void SetLDoNLocked(bool n) { ldon_locked = n; }
+
+ int32 GetGuildID() const { return (guildid); }
+ void SetGuildID(int32 id) { guildid = id; }

int16 GetLDoNLockedSkill() const { return (ldon_locked_skill); }
void SetLDoNLockedSkill(int16 n) { ldon_locked_skill = n; }
@@ -392,7 +395,9 @@
bool ldon_trap_detected;
QGlobalCache *qGlobals;
uint32 adventure_template_id;
+ int32 guildid;

+
private:
int32 loottable_id;
bool p_depop;
Index: perlparser.cpp
================================================== =================
--- perlparser.cpp (revision 1668)
+++ perlparser.cpp (working copy)
@@ -3072,7 +3072,50 @@
XSRETURN_EMPTY;
}

+XS(XS__setdoorguildid);
+XS(XS__setdoorguildid)
+{
+ dXSARGS;
+ if (items != 2)
+ Perl_croak(aTHX_ "Usage: ");
+ int8 doorid = (int)SvIV(ST(0));
+ int32 guildid = (int)SvIV(ST(1));

+ quest_manager.SetDoorGuildID(doorid, guildid);
+
+ XSRETURN_EMPTY;
+}
+
+// XSRETURN_IV(id);
+
+XS(XS__getdoorguildid);
+XS(XS__getdoorguildid)
+{
+ dXSARGS;
+ if (items != 1)
+ Perl_croak(aTHX_ "Usage: ");
+ int8 doorid = (int)SvIV(ST(0));
+
+ int32 guild = quest_manager.GetDoorGuildID(doorid);
+
+ XSRETURN_IV(guild);
+}
+
+XS(XS__setnpcguildid);
+XS(XS__setnpcguildid)
+{
+ dXSARGS;
+ if (items != 2)
+ Perl_croak(aTHX_ "Usage: fuck this, im the only person that should be seeing this");
+ int32 type = (int)SvIV(ST(0));
+ int32 guildid = (int)SvIV(ST(1));
+
+ quest_manager.SetNPCGuildID(type, guildid);
+
+ XSRETURN_EMPTY;
+}
+
+
/*
This is the callback perl will look for to setup the
quest package's XSUBs
@@ -3271,7 +3314,10 @@
newXS(strcpy(buf, "enabletitle"), XS__enabletitle, file);
newXS(strcpy(buf, "removetitle"), XS__removetitle, file);
newXS(strcpy(buf, "wearchange"), XS__wearchange, file);
- newXS(strcpy(buf, "voicetell"), XS__voicetell, file);
+ newXS(strcpy(buf, "voicetell"), XS__voicetell, file);
+ newXS(strcpy(buf, "setdoorguildid"), XS__setdoorguildid, file);
+ newXS(strcpy(buf, "getdoorguildid"), XS__getdoorguildid, file);
+ newXS(strcpy(buf, "setnpcguildid"), XS__setdoorguildid, file);
XSRETURN_YES;
}

Index: PlayerCorpse.cpp
================================================== =================
--- PlayerCorpse.cpp (revision 1668)
+++ PlayerCorpse.cpp (working copy)
@@ -822,24 +822,14 @@
if (looter == 0)
this->BeingLootedBy = 0xFFFFFFFF;
}
- int8 tCanLoot = 1;
+ int8 tCanLoot = 2;
bool lootcoin=false;
if(database.GetVariable("LootCoin",tmp, 9))
lootcoin=(atoi(tmp)==1);
if (this->BeingLootedBy != 0xFFFFFFFF && this->BeingLootedBy != client->GetID()) {
SendLootReqErrorPacket(client, 0);
- tCanLoot = 0;
+ tCanLoot = 1;
}
- else if(IsPlayerCorpse() && charid == client->CharacterID())
- tCanLoot = 2;
- else if ((IsNPCCorpse() || become_npc) && CanMobLoot(client->CharacterID()))
- tCanLoot = 2;
- else if(GetPKItem()==-1 && CanMobLoot(client->CharacterID()))
- tCanLoot = 3; //pvp loot all items, variable cash
- else if(GetPKItem()==1 && CanMobLoot(client->CharacterID()))
- tCanLoot = 4; //pvp loot 1 item, variable cash
- else if(GetPKItem()>1 && CanMobLoot(client->CharacterID()))
- tCanLoot = 5; //pvp loot 1 set item, variable cash
if(tCanLoot == 1){
if (client->Admin() < 100 || !client->GetGM()) {
SendLootReqErrorPacket(client, 2);
@@ -983,38 +973,19 @@
SendEndLootErrorPacket(client);
return;
}
- if (IsPlayerCorpse() && !CanMobLoot(client->CharacterID()) && !become_npc && (charid != client->CharacterID() && client->Admin() < 150)) {
- client->Message(13, "Error: This is a player corpse and you dont own it.");
- SendEndLootErrorPacket(client);
- return;
- }
if (pLocked && client->Admin() < 100) {
SendLootReqErrorPacket(client, 0);
client->Message(13, "Error: Corpse locked by GM.");
return;
}
- if(IsPlayerCorpse() && (charid != client->CharacterID()) && CanMobLoot(client->CharacterID()) && GetPKItem()==0){
- client->Message(13, "Error: You cannot loot any more items from this corpse.");
- SendEndLootErrorPacket(client);
- BeingLootedBy = 0xFFFFFFFF;
- return;
- }
+
const Item_Struct* item = 0;
ItemInst *inst = 0;
ServerLootItem_Struct* item_data = NULL, *bag_item_data[10];

memset(bag_item_data, 0, sizeof(bag_item_data));
- if(GetPKItem()>1)
- item = database.GetItem(GetPKItem());
- else if(GetPKItem()==-1 || GetPKItem()==1)
- item_data = GetItem(lootitem->slot_id - 22); //dont allow them to loot entire bags of items as pvp reward
- else
- item_data = GetItem(lootitem->slot_id - 22, bag_item_data);
-
- if (GetPKItem()<=1 && item_data != 0)
- {
- item = database.GetItem(item_data->item_id);
- }
+ item_data = GetItem(lootitem->slot_id - 22, bag_item_data);
+ item = database.GetItem(item_data->item_id);

if (item != 0)
{
@@ -1136,10 +1107,7 @@
}
}
}
-
- if(GetPKItem()!=-1)
- SetPKItem(0);
-
+
//now send messages to all interested parties

//creates a link for the item
Index: questmgr.cpp
================================================== =================
--- questmgr.cpp (revision 1668)
+++ questmgr.cpp (working copy)
@@ -2464,3 +2464,26 @@
}
}

+void QuestManager::SetDoorGuildID(int8 doorid, int32 guildid) {
+
+ Doors* door = entity_list.GetDoorByDoorID(doorid);
+ if(door && door != NULL)
+ door->SetGuildID(guildid);
+
+}
+
+int16 QuestManager::GetDoorGuildID(int8 doorid) {
+
+ Doors* door = entity_list.GetDoorByDoorID(doorid);
+ if(door && door != NULL)
+ return door->GetGuildID();
+ else
+ return 0;
+
+}
+
+void QuestManager::SetNPCGuildID(int32 type, int32 guildid) {
+
+ database.SetGuildNPC(type, guildid);
+
+}
\ No newline at end of file
Index: questmgr.h
================================================== =================
--- questmgr.h (revision 1668)
+++ questmgr.h (working copy)
@@ -217,7 +217,12 @@
uint8 FactionValue();
void wearchange(int8 slot, int16 texture);
void voicetell(char *str, int macronum, int racenum, int gendernum);
+ void SetDoorGuildID(int8 doorid, int32 guildid);
+ void SetNPCGuildID(int32 type, int32 guildid);
+ int16 GetDoorGuildID(int8 doorid);

+
+
//not in here because it retains perl types
//thing ChooseRandom(array_of_things)

Index: spell_effects.cpp
================================================== =================
--- spell_effects.cpp (revision 1668)
+++ spell_effects.cpp (working copy)
@@ -652,7 +652,7 @@
}
else
{
- Stun(effect_value);
+ Stun(1000);
}
break;
}
@@ -1342,7 +1342,7 @@
{
// solar: the spinning is handled by the client
if(buffslot >= 0)
- Stun(buffs[buffslot].ticsremaining * 6000);
+ Stun(1000);
}
break;
}
Index: Zone.vcproj
================================================== =================
--- Zone.vcproj (revision 1668)
+++ Zone.vcproj (working copy)
@@ -1097,11 +1097,11 @@
>
</File>
<File
- RelativePath="..\common\patches\SoF.cpp"
+ RelativePath="..\common\patches\SoD.cpp"
>
</File>
<File
- RelativePath="..\common\patches\SoD.cpp"
+ RelativePath="..\common\patches\SoF.cpp"
>
</File>
<File
Index: zonedb.cpp
================================================== =================
--- zonedb.cpp (revision 1668)
+++ zonedb.cpp (working copy)
@@ -1095,8 +1095,9 @@
"npc_types.maxlevel,"
"npc_types.scalerate,"
"npc_types.private_corpse,"
- "npc_types.unique_spawn_by_name";
-
+ "npc_types.unique_spawn_by_name,"
+ "npc_types.guildid";
+
MakeAnyLenString(&query, "%s FROM npc_types WHERE id=%d", basic_query, id);

if (RunQuery(query, strlen(query), errbuf, &result)) {
@@ -1265,6 +1266,7 @@
tmpNPCType->scalerate = atoi(row[r++]);
tmpNPCType->private_corpse = atoi(row[r++]) == 1 ? true : false;
tmpNPCType->unique_spawn_by_name = atoi(row[r++]) == 1 ? true : false;
+ tmpNPCType->guildid = atoi(row[r++]);

// If NPC with duplicate NPC id already in table,
// free item we attempted to add.
Index: zonedb.h
================================================== =================
--- zonedb.h (revision 1668)
+++ zonedb.h (working copy)
@@ -339,7 +339,14 @@
*/
void QGlobalPurge();

+
/*
+ * MortalQuest
+ */
+
+ bool SetGuildNPC(int32 npc_type ,int16 guild_id);
+
+ /*
* Misc stuff.
* PLEASE DO NOT ADD TO THIS COLLECTION OF CRAP UNLESS YOUR METHOD
* REALLY HAS NO BETTER SECTION
Index: zonedump.h
================================================== =================
--- zonedump.h (revision 1668)
+++ zonedump.h (working copy)
@@ -117,6 +117,7 @@
int32 scalerate;
bool private_corpse;
bool unique_spawn_by_name;
+ int32 guildid;
};

struct ZSDump_Spawn2 {
Index: zoning.cpp
================================================== =================
--- zoning.cpp (revision 1668)
+++ zoning.cpp (working copy)
@@ -710,7 +710,7 @@
}

void Client::GoToDeath() {
- MovePC(m_pp.binds[0].zoneId, 0.0f, 0.0f, 0.0f, 0.0f, 1, ZoneToBindPoint);
+ MovePC(1, 0.0f, 0.0f, 0.0f, 0.0f, 1, ZoneToBindPoint);
}

void Client::SetZoneFlag(uint32 zone_id) {

So_1337
09-29-2010, 02:29 PM
These are great to see, thanks Secrets =)

dlobrecht
10-01-2010, 03:42 AM
Thank you for uploading your work, It is very much appreciated. :)

I am having trouble trying to patch this code to r1668.

I was able to patch your other custom code that you created : Disable PVP for same group/same guild without any problems.

I noticed a difference of spacing or tabs between the two patches.

Any ideas what I am doing wrong?