/** * Feed homunculus * @param sd * @param hd */ int hom_food(struct map_session_data *sd, struct homun_data *hd) { int i, foodID, emotion; nullpo_retr(1,sd); nullpo_retr(1,hd); if (hd->homunculus.vaporize) return 1; foodID = hd->homunculusDB->foodID; i = pc_search_inventory(sd,foodID); if (i < 0) { clif_hom_food(sd,foodID,0); return 1; } pc_delitem(sd,i,1,0,0,LOG_TYPE_CONSUME); if ( hd->homunculus.hunger >= 91 ) { hom_decrease_intimacy(hd, 50); emotion = ET_KEK; } else if ( hd->homunculus.hunger >= 76 ) { hom_decrease_intimacy(hd, 5); emotion = ET_PROFUSELY_SWEAT; } else if ( hd->homunculus.hunger >= 26 ) { hom_increase_intimacy(hd, 75); emotion = ET_DELIGHT; } else if ( hd->homunculus.hunger >= 11 ) { hom_increase_intimacy(hd, 100); emotion = ET_DELIGHT; } else { hom_increase_intimacy(hd, 50); emotion = ET_DELIGHT; } hd->homunculus.hunger += 10; //dunno increase value for each food if(hd->homunculus.hunger > 100) hd->homunculus.hunger = 100; log_feeding(sd, LOG_FEED_HOMUNCULUS, foodID); clif_emotion(&hd->bl,emotion); clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger); clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100); clif_hom_food(sd,foodID,1); // Too much food :/ if(hd->homunculus.intimacy == 0) return hom_delete(sd->hd, ET_HUK); return 0; }
int merc_hom_food(struct map_session_data *sd, struct homun_data *hd) { int i, foodID, emotion; char mes[255]; if(hd->homunculus.vaporize) return 1 ; foodID = hd->homunculusDB->foodID; i = pc_search_inventory(sd,foodID); if(i < 0) { clif_hom_food(sd,foodID,0); return 1; } pc_delitem(sd,i,1,0,0); if ( hd->homunculus.hunger >= 91 ) { merc_hom_decrease_intimacy(hd, 50); emotion = E_WAH; } else if ( hd->homunculus.hunger >= 76 ) { merc_hom_decrease_intimacy(hd, 5); emotion = E_SWT2; } else if ( hd->homunculus.hunger >= 26 ) { merc_hom_increase_intimacy(hd, 75); emotion = E_HO; } else if ( hd->homunculus.hunger >= 11 ) { merc_hom_increase_intimacy(hd, 100); emotion = E_HO; } else { merc_hom_increase_intimacy(hd, 50); emotion = E_HO; } hd->homunculus.hunger += 10; //dunno increase value for each food if(hd->homunculus.hunger > 100) hd->homunculus.hunger = 100; clif_emotion(&hd->bl,emotion); snprintf(mes, sizeof mes,msg_txt(908),hd->homunculus.name); clif_message(&hd->bl,mes); clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger); clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100); clif_hom_food(sd,foodID,1); // Too much food :/ if(hd->homunculus.intimacy == 0) return merc_hom_delete(sd->hd, E_OMG); return 0; }
static int merc_hom_hungry(int tid, unsigned int tick, int id, intptr_t data) { struct map_session_data *sd; struct homun_data *hd; char mes[255]; bool talk = true; sd=map_id2sd(id); if(!sd) return 1; if(!sd->status.hom_id || !(hd=sd->hd)) return 1; if(hd->hungry_timer != tid){ ShowError("merc_hom_hungry_timer %d != %d\n",hd->hungry_timer,tid); return 0; } hd->hungry_timer = INVALID_TIMER; hd->homunculus.hunger-- ; if(hd->homunculus.hunger <= 10) { clif_emotion(&hd->bl, E_AN); snprintf(mes, sizeof mes,msg_txt(905),hd->homunculus.name); } else if(hd->homunculus.hunger == 25) { clif_emotion(&hd->bl, E_HMM); snprintf(mes, sizeof mes,msg_txt(906),hd->homunculus.name); } else if(hd->homunculus.hunger == 75) { clif_emotion(&hd->bl, E_OK); snprintf(mes, sizeof mes,msg_txt(907),hd->homunculus.name); } else talk = false; if( talk ) clif_message(&hd->bl, mes); if(hd->homunculus.hunger < 0) { hd->homunculus.hunger = 0; // Delete the homunculus if intimacy <= 100 if ( !merc_hom_decrease_intimacy(hd, 100) ) return merc_hom_delete(hd, E_OMG); clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100); } clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger); hd->hungry_timer = add_timer(tick+hd->homunculusDB->hungryDelay,merc_hom_hungry,sd->bl.id,0); //simple Fix albator return 0; }
int merc_hom_food(struct map_session_data *sd, struct homun_data *hd) { int i, foodID, emotion; if(hd->homunculus.vaporize) return 1 ; foodID = hd->homunculusDB->foodID; i = pc_search_inventory(sd,foodID); if(i < 0) { clif_hom_food(sd,foodID,0); return 1; } pc_delitem(sd,i,1,0); if ( hd->homunculus.hunger >= 91 ) { merc_hom_decrease_intimacy(hd, 50); emotion = 16; } else if ( hd->homunculus.hunger >= 76 ) { merc_hom_decrease_intimacy(hd, 5); emotion = 19; } else if ( hd->homunculus.hunger >= 26 ) { merc_hom_increase_intimacy(hd, 75); emotion = 2; } else if ( hd->homunculus.hunger >= 11 ) { merc_hom_increase_intimacy(hd, 100); emotion = 2; } else { merc_hom_increase_intimacy(hd, 50); emotion = 2; } hd->homunculus.hunger += 10; //dunno increase value for each food if(hd->homunculus.hunger > 100) hd->homunculus.hunger = 100; clif_emotion(&hd->bl,emotion) ; clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger); clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100); clif_hom_food(sd,foodID,1); // Too much food :/ if(hd->homunculus.intimacy == 0) return merc_hom_delete(sd->hd, 23); //omg return 0; }
static int merc_hom_hungry(int tid, unsigned int tick, int id, intptr_t data) { struct map_session_data *sd; struct homun_data *hd; int var; var = 0; sd=map_id2sd(id); if(!sd) return 1; if(!sd->status.hom_id || !(hd=sd->hd)) return 1; if(hd->hungry_timer != tid){ ShowError("merc_hom_hungry_timer %d != %d\n",hd->hungry_timer,tid); return 0; } hd->hungry_timer = INVALID_TIMER; hd->homunculus.hunger-- ; if(hd->homunculus.hunger <= 10) { clif_emotion(&hd->bl, E_AN); } else if(hd->homunculus.hunger == 25) { clif_emotion(&hd->bl, E_HMM); } else if(hd->homunculus.hunger == 75) { clif_emotion(&hd->bl, E_OK); } if(hd->homunculus.hunger < 0) { hd->homunculus.hunger = 0; // Delete the homunculus if intimacy <= 100 //if ( !merc_hom_decrease_intimacy(hd, 100) ) //merc_hom_vaporize(sd,1); //return merc_hom_delete(hd, E_OMG); var = 1; hd->homunculus.intimacy = 100; clif_send_homdata(sd,SP_INTIMATE,0); //hd->homunculus.intimacy / 100 } clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger); hd->hungry_timer = add_timer(tick+hd->homunculusDB->hungryDelay,merc_hom_hungry,sd->bl.id,0); //simple Fix albator if(var == 1) merc_hom_dead(hd,1); return 0; }
int merc_hom_food(struct map_session_data *sd, struct homun_data *hd, int value) { int emotion, addint; if(hd->homunculus.vaporize) return 1 ; // foodID = hd->homunculusDB->foodID; // i = pc_search_inventory(sd,foodID); // if(i < 0) { // clif_hom_food(sd,foodID,0); // return 1; // } // pc_delitem(sd,i,1,0,0); // if ( hd->homunculus.hunger >= 91 ) { addint = 100 - hd->homunculus.hunger; if(addint > value) addint = value; merc_hom_increase_intimacy(hd, addint); emotion = E_HO; // } else if ( hd->homunculus.hunger >= 76 ) { // merc_hom_increase_intimacy(hd, 5); // emotion = E_HO; // } else if ( hd->homunculus.hunger >= 26 ) { // merc_hom_increase_intimacy(hd, 5); // emotion = E_HO; // } else if ( hd->homunculus.hunger >= 11 ) { // merc_hom_increase_intimacy(hd, 5); // emotion = E_HO; // } else { // merc_hom_increase_intimacy(hd, 5); // emotion = E_HO; // } hd->homunculus.hunger += value; //dunno increase value for each food if(hd->homunculus.hunger > 100) hd->homunculus.hunger = 100; clif_emotion(&hd->bl,emotion); clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger); // clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100); // clif_hom_food(sd,foodID,1); // Too much food :/ // if(hd->homunculus.intimacy == 0) // return merc_hom_delete(sd->hd, E_OMG); return 0; }
void merc_hom_revive(struct homun_data *hd, unsigned int hp, unsigned int sp) { struct map_session_data *sd = hd->master; hd->homunculus.hp = hd->battle_status.hp; if (!sd) return; clif_send_homdata(sd,SP_ACK,0); clif_hominfo(sd,hd,1); clif_hominfo(sd,hd,0); clif_homskillinfoblock(sd); }
static int merc_hom_hungry(int tid,unsigned int tick,int id,int data) { struct map_session_data *sd; struct homun_data *hd; sd=map_id2sd(id); if(!sd) return 1; if(!sd->status.hom_id || !(hd=sd->hd)) return 1; if(hd->hungry_timer != tid){ ShowError("merc_hom_hungry_timer %d != %d\n",hd->hungry_timer,tid); return 0; } hd->hungry_timer = -1; hd->homunculus.hunger-- ; if(hd->homunculus.hunger <= 10) { clif_emotion(&hd->bl, 6) ; //an } else if(hd->homunculus.hunger == 25) { clif_emotion(&hd->bl, 20) ; //hmm } else if(hd->homunculus.hunger == 75) { clif_emotion(&hd->bl, 33) ; //ok } if(hd->homunculus.hunger < 0) { hd->homunculus.hunger = 0; // Delete the homunculus if intimacy <= 100 if ( !merc_hom_decrease_intimacy(hd, 100) ) return merc_hom_delete(hd, 23); //omg clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100); } clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger); hd->hungry_timer = add_timer(tick+hd->homunculusDB->hungryDelay,merc_hom_hungry,sd->bl.id,0); //simple Fix albator return 0; }
/** * Timer to reduce hunger level */ static int hom_hungry(int tid, unsigned int tick, int id, intptr_t data) { struct map_session_data *sd; struct homun_data *hd; sd = map_id2sd(id); if (!sd) return 1; if (!sd->status.hom_id || !(hd=sd->hd)) return 1; if (hd->hungry_timer != tid) { ShowError("hom_hungry_timer %d != %d\n",hd->hungry_timer,tid); return 0; } hd->hungry_timer = INVALID_TIMER; hd->homunculus.hunger--; if(hd->homunculus.hunger <= 10) { clif_emotion(&hd->bl, ET_FRET); } else if(hd->homunculus.hunger == 25) { clif_emotion(&hd->bl, ET_SCRATCH); } else if(hd->homunculus.hunger == 75) { clif_emotion(&hd->bl, ET_OK); } if (hd->homunculus.hunger < 0) { hd->homunculus.hunger = 0; // Delete the homunculus if intimacy <= 100 if (!hom_decrease_intimacy(hd, 100)) return hom_delete(hd, ET_HUK); clif_send_homdata(sd,SP_INTIMATE,hd->homunculus.intimacy / 100); } clif_send_homdata(sd,SP_HUNGRY,hd->homunculus.hunger); hd->hungry_timer = add_timer(tick+hd->homunculusDB->hungryDelay,hom_hungry,sd->bl.id,0); //simple Fix albator return 0; }
/** * Revive homunculus * @param hd * @param hp * @param sp */ void hom_revive(struct homun_data *hd, unsigned int hp, unsigned int sp) { struct map_session_data *sd = hd->master; hd->homunculus.hp = hd->battle_status.hp; if (!sd) return; clif_send_homdata(sd,SP_ACK,0); clif_hominfo(sd,hd,1); clif_hominfo(sd,hd,0); clif_homskillinfoblock(sd); if (hd->homunculus.class_ == 6052) //eleanor sc_start(&hd->bl,&hd->bl, SC_STYLE_CHANGE, 100, MH_MD_FIGHTING, -1); }
/** * Receive homunculus data from char server * @param account_id : owner account_id of the homon * @param sh : homonculus data from char-serv * @param flag : does the creation in inter-serv was a success (0:no,1:yes) * @return 0:failure, 1:sucess */ int hom_recv_data(uint32 account_id, struct s_homunculus *sh, int flag) { struct map_session_data *sd; struct homun_data *hd; bool created = false; sd = map_id2sd(account_id); if(!sd) return 0; if (sd->status.char_id != sh->char_id) { if (sd->status.hom_id == sh->hom_id) sh->char_id = sd->status.char_id; //Correct char id. else return 0; } if(!flag) { // Failed to load sd->status.hom_id = 0; return 0; } if (!sd->status.hom_id) { //Hom just created. sd->status.hom_id = sh->hom_id; created = true; } if (sd->hd) //uh? Overwrite the data. memcpy(&sd->hd->homunculus, sh, sizeof(struct s_homunculus)); else hom_alloc(sd, sh); hd = sd->hd; if (created) status_percent_heal(&hd->bl, 100, 100); if(hd && hd->homunculus.hp && !hd->homunculus.vaporize && hd->bl.prev == NULL && sd->bl.prev != NULL) { if(map_addblock(&hd->bl)) return 0; clif_spawn(&hd->bl); clif_send_homdata(sd,SP_ACK,0); clif_hominfo(sd,hd,1); clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89] clif_homskillinfoblock(sd); hom_init_timers(hd); } return 1; }
int merc_call_homunculus(struct map_session_data *sd) { struct homun_data *hd; if( sd->sc.data[SC__GROOMY] ) return 0; if( map[sd->bl.m].flag.ancient ) return 0; // Cannot call homunculus on Ancient WoE if (!sd->status.hom_id) //Create a new homun. return merc_create_homunculus_request(sd, HM_CLASS_BASE + rand(0, 7)) ; // If homunc not yet loaded, load it if (!sd->hd) return intif_homunculus_requestload(sd->status.account_id, sd->status.hom_id); hd = sd->hd; if (!hd->homunculus.vaporize) return 0; //Can't use this if homun wasn't vaporized. merc_hom_init_timers(hd); hd->homunculus.vaporize = 0; if (hd->bl.prev == NULL) { //Spawn him hd->bl.x = sd->bl.x; hd->bl.y = sd->bl.y; hd->bl.m = sd->bl.m; map_addblock(&hd->bl); clif_spawn(&hd->bl); clif_send_homdata(sd,SP_ACK,0); clif_hominfo(sd,hd,1); clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89] clif_homskillinfoblock(sd); if (battle_config.slaves_inherit_speed&1) status_calc_bl(&hd->bl, SCB_SPEED); merc_save(hd); } else //Warp him to master. unit_warp(&hd->bl,sd->bl.m, sd->bl.x, sd->bl.y,CLR_OUTSIGHT); return 1; }
/** * Make a player spawn a homonculus (call) * @param sd * @return False:failure, True:sucess */ bool hom_call(struct map_session_data *sd) { struct homun_data *hd; if (!sd->status.hom_id) //Create a new homun. return hom_create_request(sd, HM_CLASS_BASE + rnd_value(0, 7)) ; // If homunc not yet loaded, load it if (!sd->hd) return intif_homunculus_requestload(sd->status.account_id, sd->status.hom_id); hd = sd->hd; if (!hd->homunculus.vaporize) return false; //Can't use this if homun wasn't vaporized. if (hd->homunculus.vaporize == HOM_ST_MORPH) return false; // Can't call homunculus (morph state). hom_init_timers(hd); hd->homunculus.vaporize = HOM_ST_ACTIVE; if (hd->bl.prev == NULL) { //Spawn him hd->bl.x = sd->bl.x; hd->bl.y = sd->bl.y; hd->bl.m = sd->bl.m; if(map_addblock(&hd->bl)) return false; clif_spawn(&hd->bl); clif_send_homdata(sd,SP_ACK,0); clif_hominfo(sd,hd,1); clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89] clif_homskillinfoblock(sd); if (battle_config.slaves_inherit_speed&1) status_calc_bl(&hd->bl, SCB_SPEED); hom_save(hd); } else //Warp him to master. unit_warp(&hd->bl,sd->bl.m, sd->bl.x, sd->bl.y,CLR_OUTSIGHT); return true; }