// ギルド城データ変更要求 int guild_castledatasave(int castle_id,int index,int value) { if( index == 1 ) { //The castle's owner has changed? Update Guardian ownership, too. [Skotlex] struct guild_castle *gc = guild_castle_search(castle_id); int m = -1; if (gc) m = map_mapindex2mapid(gc->mapindex); if (m != -1) map_foreachinmap(mob_guardian_guildchange, m, BL_MOB); //FIXME: why not iterate over gc->guardian[i].id ? } else if( index == 3 ) { // defense invest change -> recalculate guardian hp struct guild_castle* gc = guild_castle_search(castle_id); if( gc ) { int i; struct mob_data* gd; for( i = 0; i < MAX_GUARDIANS; i++ ) if( gc->guardian[i].visible && (gd = map_id2md(gc->guardian[i].id)) != NULL ) status_calc_mob(gd,0); } } return intif_guild_castle_datasave(castle_id,index,value); }
// ギルド城データ変更通知 int guild_castledatasaveack(int castle_id,int index,int value) { struct guild_castle *gc=guild_castle_search(castle_id); if(gc==NULL){ return 0; } switch(index){ case 1: gc->guild_id = value; break; case 2: gc->economy = value; break; case 3: gc->defense = value; break; case 4: gc->triggerE = value; break; case 5: gc->triggerD = value; break; case 6: gc->nextTime = value; break; case 7: gc->payTime = value; break; case 8: gc->createTime = value; break; case 9: gc->visibleC = value; break; case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: gc->guardian[index-10].visible = value; break; default: ShowError("guild_castledatasaveack ERROR!! (Not found index=%d)\n", index); return 0; } return 1; }
// ギルドデータ一括受信(初期化時) int guild_castlealldataload(int len,struct guild_castle *gc) { int i; int n = (len-4) / sizeof(struct guild_castle), ev = -1; nullpo_retr(0, gc); //Last owned castle in the list invokes ::OnAgitinit for(i = 0; i < n; i++) { if ((gc + i)->guild_id) ev = i; } // 城データ格納とギルド情報要求 for(i = 0; i < n; i++, gc++) { struct guild_castle *c = guild_castle_search(gc->castle_id); if (!c) { ShowError("guild_castlealldataload Castle id=%d not found.\n", gc->castle_id); continue; } memcpy(&c->guild_id,&gc->guild_id, sizeof(struct guild_castle) - ((int)&c->guild_id - (int)c) ); if( c->guild_id ){ if(i!=ev) guild_request_info(c->guild_id); else guild_npc_request_info(c->guild_id, "::OnAgitInit"); } } if (ev == -1) //No castles owned, invoke OnAgitInit as it is. npc_event_doall("OnAgitInit"); return 0; }
// ギルド城データ要求返信 int guild_castledataloadack(int castle_id,int index,int value) { struct guild_castle *gc=guild_castle_search(castle_id); int code=castle_id|(index<<16); struct eventlist *ev,*ev2; if(gc==NULL){ return 0; } switch(index){ case 1: gc->guild_id = value; if (value && guild_search(value)==NULL) //Request guild data which will be required for spawned guardians. [Skotlex] guild_request_info(value); break; case 2: gc->economy = value; break; case 3: gc->defense = value; break; case 4: gc->triggerE = value; break; case 5: gc->triggerD = value; break; case 6: gc->nextTime = value; break; case 7: gc->payTime = value; break; case 8: gc->createTime = value; break; case 9: gc->visibleC = value; break; case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: gc->guardian[index-10].visible = value; break; case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: gc->guardian[index-18].hp = value; break; default: ShowError("guild_castledataloadack ERROR!! (Not found index=%d)\n", index); return 0; } if( (ev=idb_remove(guild_castleinfoevent_db,code))!=NULL ){ while(ev){ npc_event_do(ev->name); ev2=ev->next; aFree(ev); ev=ev2; } } return 1; }
struct guild_castle *guild_mapindex2gc(short mapname) { int i; struct guild_castle *gc=NULL; for(i=0;i<MAX_GUILDCASTLE;i++){ gc=guild_castle_search(i); if(!gc) continue; if(strcmp(gc->map_name,mapindex_id2name(mapname))==0) return gc; } return NULL; }
// [MouseJstr] // How many castles does this guild have? int guild_checkcastles(struct guild *g) { int i,nb_cas=0, id,cas_id=0; struct guild_castle *gc; id=g->guild_id; for(i=0;i<MAX_GUILDCASTLE;i++){ gc=guild_castle_search(i); cas_id=gc->guild_id; if(g->guild_id==cas_id) nb_cas=nb_cas+1; } //end for return nb_cas; }
// ギルド城データ変更要求 int guild_castledatasave(int castle_id,int index,int value) { if (index == 1) { //The castle's owner has changed? Update Guardian ownership, too. [Skotlex] struct guild_castle *gc = guild_castle_search(castle_id); int m = -1; if (gc) m = map_mapname2mapid(gc->map_name); if (m != -1) map_foreachinmap(mob_guardian_guildchange, m, BL_MOB); } return intif_guild_castle_datasave(castle_id,index,value); }
// How many castles does this guild have? int guild_checkcastles(struct guild *g) { int i, nb_cas = 0; struct guild_castle* gc; for(i = 0; i < MAX_GUILDCASTLE; i++) { gc = guild_castle_search(i); if(gc && gc->guild_id == g->guild_id) nb_cas++; } return nb_cas; }
int guild_save_sub(int tid, unsigned int tick, int id, intptr data) { static int Gid[MAX_GUILDCASTLE]; // previous owning guild struct guild_castle *gc; int i; for(i = 0; i < MAX_GUILDCASTLE; i++) { // [Yor] gc = guild_castle_search(i); if (!gc) continue; if (gc->guild_id != Gid[i]) { // Re-save guild id if its owner guild has changed guild_castledatasave(gc->castle_id, 1, gc->guild_id); Gid[i] = gc->guild_id; } } return 0; }
// ギルドデータ一括受信(初期化時) int guild_castlealldataload(int len,struct guild_castle *gc) { int i; int n = (len-4) / sizeof(struct guild_castle); int ev; nullpo_ret(gc); //Last owned castle in the list invokes ::OnAgitinit for( i = n-1; i >= 0 && !(gc[i].guild_id); --i ); ev = i; // offset of castle or -1 if( ev < 0 ) { //No castles owned, invoke OnAgitInit as it is. npc_event_doall("OnAgitInit"); npc_event_doall("OnAgitInit2"); } else // load received castles into memory, one by one for( i = 0; i < n; i++, gc++ ) { struct guild_castle *c = guild_castle_search(gc->castle_id); if (!c) { ShowError("guild_castlealldataload Castle id=%d not found.\n", gc->castle_id); continue; } // update mapserver castle data with new info memcpy(&c->guild_id, &gc->guild_id, sizeof(struct guild_castle) - ((uintptr_t)&c->guild_id - (uintptr_t)c)); if( c->guild_id ) { if( i != ev ) guild_request_info(c->guild_id); else { // last owned one guild_npc_request_info(c->guild_id, "::OnAgitInit"); guild_npc_request_info(c->guild_id, "::OnAgitInit2"); } } } return 0; }
int guild_save_sub(int tid,unsigned int tick,int id,int data) { struct guild_castle *gc; int i,j; for(i = 0; i < MAX_GUILDCASTLE; i++) { // [Yor] gc = guild_castle_search(i); if (!gc) continue; if (gc->guild_id != Gid[i]) { // Re-save guild id if its owner guild has changed guild_castledatasave(gc->castle_id, 1, gc->guild_id); Gid[i] = gc->guild_id; } for (j = 0; j < MAX_GUARDIANS; j++) { if (gc->guardian[j].visible && Ghp[i][j] != gc->guardian[j].hp) guild_castledatasave(gc->castle_id, 18+j, gc->guardian[j].hp); } } return 0; }
//Innvoked on /breakguild "Guild name" int guild_broken(int guild_id,int flag) { struct guild *g=guild_search(guild_id); struct guild_castle *gc=NULL; struct map_session_data *sd; int i; char name[EVENT_NAME_LENGTH]; if(flag!=0 || g==NULL) return 0; //we call castle_event::OnGuildBreak of all castlesof the guild //you can set all castle_events in the castle_db.txt for(i=0;i<MAX_GUILDCASTLE;i++){ if( (gc=guild_castle_search(i)) != NULL ){ if(gc->guild_id == guild_id){ safestrncpy(name, gc->castle_event, 50); npc_event_do(strcat(name,"::OnGuildBreak")); } } } for(i=0;i<g->max_member;i++){ // ギルド解散を通知 if((sd=g->member[i].sd)!=NULL){ if(sd->state.storage_flag == 2) storage_guild_storage_quit(sd,1); sd->status.guild_id=0; clif_guild_broken(g->member[i].sd,0); clif_charnameupdate(sd); // [LuzZza] } } guild_db->foreach(guild_db,guild_broken_sub,guild_id); castle_db->foreach(castle_db,castle_guild_broken_sub,guild_id); guild_storage_delete(guild_id); idb_remove(guild_db,guild_id); return 0; }