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; }
/** * Begin the actual catching process of a monster. * @param sd : player requesting * @param target_id : monster ID of pet to catch * @return 0:success, 1:failure */ int pet_catch_process2(struct map_session_data* sd, int target_id) { struct mob_data* md; int i = 0, pet_catch_rate = 0; nullpo_retr(1, sd); md = (struct mob_data*)map_id2bl(target_id); if(!md || md->bl.type != BL_MOB || md->bl.prev == NULL) { // Invalid inputs/state, abort capture. clif_pet_roulette(sd,0); sd->catch_target_class = -1; sd->itemid = sd->itemindex = -1; return 1; } //FIXME: delete taming item here, if this was an item-invoked capture and the item was flagged as delay-consume [ultramage] i = search_petDB_index(md->mob_id,PET_CLASS); //catch_target_class == 0 is used for universal lures (except bosses for now). [Skotlex] if (sd->catch_target_class == 0 && !status_has_mode(&md->status,MD_STATUS_IMMUNE)) sd->catch_target_class = md->mob_id; if(i < 0 || sd->catch_target_class != md->mob_id) { clif_emotion(&md->bl, E_AG); //mob will do /ag if wrong lure is used on them. clif_pet_roulette(sd,0); sd->catch_target_class = -1; return 1; } pet_catch_rate = (pet_db[i].capture + (sd->status.base_level - md->level)*30 + sd->battle_status.luk*20)*(200 - get_percentage(md->status.hp, md->status.max_hp))/100; if(pet_catch_rate < 1) pet_catch_rate = 1; if(battle_config.pet_catch_rate != 100) pet_catch_rate = (pet_catch_rate*battle_config.pet_catch_rate)/100; if(rnd()%10000 < pet_catch_rate) { unit_remove_map(&md->bl,CLR_OUTSIGHT); status_kill(&md->bl); clif_pet_roulette(sd,1); intif_create_pet(sd->status.account_id,sd->status.char_id,pet_db[i].class_,mob_db(pet_db[i].class_)->lv, pet_db[i].EggID,0,pet_db[i].intimate,100,0,1,pet_db[i].jname); } else { clif_pet_roulette(sd,0); sd->catch_target_class = -1; } 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, 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 (!hom_decrease_intimacy(hd, 100)) return 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,hom_hungry,sd->bl.id,0); //simple Fix albator return 0; }
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; }
/** * 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; }
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; }
/** * Delete a homunculus, completely "killing it". * Emote is the emotion the master should use, send negative to disable. * @param hd * @param emote */ int hom_delete(struct homun_data *hd, int emote) { struct map_session_data *sd; nullpo_ret(hd); sd = hd->master; if (!sd) return unit_free(&hd->bl,CLR_DEAD); if (emote >= 0) clif_emotion(&sd->bl, emote); //This makes it be deleted right away. hd->homunculus.intimacy = 0; // Send homunculus_dead to client hd->homunculus.hp = 0; clif_hominfo(sd, hd, 0); return unit_remove_map(&hd->bl,CLR_OUTSIGHT); }
int merc_hom_evolution (struct homun_data *hd) { struct s_homunculus *hom; struct h_stats *max, *min; struct map_session_data *sd; int class_; nullpo_ret (hd); // if (!hd->homunculusDB->evo_class || hd->homunculus.class_ == hd->homunculusDB->evo_class) { // clif_emotion (&hd->bl, E_SWT); // return 0 ; // } if(hd->homunculusDB->emax.luk > 99) return 0; sd = hd->master; if (!sd) return 0; class_ = (hd->homunculus.class_) + 1; if (!merc_hom_change_class (hd, class_)) { ShowError ("merc_hom_evolution: Can't evolve homunc from %d to %d", hd->homunculus.class_, hd->homunculusDB->evo_class); return 0; } //Apply evolution bonuses hom = &hd->homunculus; max = &hd->homunculusDB->emax; min = &hd->homunculusDB->emin; intif_rename_hom(sd, hd->homunculusDB->name); hd->homunculus.rename_flag = 1; hom->max_hp += rnd_value (min->HP, max->HP); hom->max_sp += rnd_value (min->SP, max->SP); hom->str += 10 * rnd_value (min->str, max->str); hom->agi += 10 * rnd_value (min->agi, max->agi); hom->vit += 10 * rnd_value (min->vit, max->vit); hom->int_ += 10 * rnd_value (min->int_, max->int_); hom->dex += 10 * rnd_value (min->dex, max->dex); // hom->luk += 10 * rnd_value (min->luk, max->luk); hom->intimacy = 100; unit_remove_map (&hd->bl, CLR_OUTSIGHT); map_addblock (&hd->bl); clif_spawn (&hd->bl); clif_emotion (&sd->bl, E_NO1); clif_specialeffect(&hd->bl,72,AREA); clif_specialeffect(&hd->bl,99,AREA); //status_Calc flag&1 will make current HP/SP be reloaded from hom structure hom->hp = hd->battle_status.hp; hom->sp = hd->battle_status.sp; status_calc_homunculus (hd, 1); if (! (battle_config.hom_setting & 0x2)) skill_unit_move (&sd->hd->bl, gettick(), 1); // apply land skills immediately if(hom->lvlevo1) hom->lvlevo2 = hom->level; else hom->lvlevo1 = hom->level; hom->evomoment = 0; merc_hom_gainexp(hd,1); return 1 ; }
int pet_catch_process2(struct map_session_data *sd,int target_id) { struct mob_data *md; int i=0,pet_catch_rate=0; nullpo_retr(1, sd); md=(struct mob_data*)map_id2bl(target_id); if(!md || md->bl.type != BL_MOB || md->bl.prev == NULL){ //Abort capture. sd->catch_target_class = -1; sd->itemid = sd->itemindex = -1; return 1; } if (sd->menuskill_id != SA_TAMINGMONSTER) { //Exploit? clif_pet_rulet(sd,0); sd->catch_target_class = -1; return 1; } if (sd->menuskill_lv > 0) { //Consume the pet lure [Skotlex] i=pc_search_inventory(sd,sd->menuskill_lv); if (i < 0) { //they tried an exploit? clif_pet_rulet(sd,0); sd->catch_target_class = -1; return 1; } //Delete the item if (sd->itemid == sd->menuskill_lv) sd->itemid = sd->itemindex = -1; sd->menuskill_id = sd->menuskill_lv = 0; pc_delitem(sd,i,1,0); } i = search_petDB_index(md->class_,PET_CLASS); //catch_target_class == 0 is used for universal lures. [Skotlex] //for now universal lures do not include bosses. if (sd->catch_target_class == 0 && !(md->status.mode&MD_BOSS)) sd->catch_target_class = md->class_; if(i < 0 || sd->catch_target_class != md->class_) { clif_emotion(&md->bl, 7); //mob will do /ag if wrong lure is used on them. clif_pet_rulet(sd,0); sd->catch_target_class = -1; return 1; } pet_catch_rate = (pet_db[i].capture + (sd->status.base_level - md->level)*30 + sd->battle_status.luk*20)*(200 - md->status.hp*100/md->status.max_hp)/100; if(pet_catch_rate < 1) pet_catch_rate = 1; if(battle_config.pet_catch_rate != 100) pet_catch_rate = (pet_catch_rate*battle_config.pet_catch_rate)/100; if(rand()%10000 < pet_catch_rate) { unit_remove_map(&md->bl,0); status_kill(&md->bl); clif_pet_rulet(sd,1); // if(battle_config.etc_log) // printf("rulet success %d\n",target_id); intif_create_pet(sd->status.account_id,sd->status.char_id,pet_db[i].class_,mob_db(pet_db[i].class_)->lv, pet_db[i].EggID,0,pet_db[i].intimate,100,0,1,pet_db[i].jname); } else { sd->catch_target_class = -1; clif_pet_rulet(sd,0); } return 0; }