def die(self, cause=None): if cause == ewcfg.cause_busted: self.busted = True else: self.busted = False # reset busted state on normal death; potentially move this to ewspooky.revive self.life_state = ewcfg.life_state_corpse ewstats.increment_stat(user=self, metric=ewcfg.stat_lifetime_deaths) ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_slimeloss, n=self.slimes) if cause != ewcfg.cause_killing and cause != ewcfg.cause_suicide: ewstats.increment_stat(user=self, metric=ewcfg.stat_lifetime_pve_deaths) self.slimes = 0 self.poi = ewcfg.poi_id_thesewers self.bounty = 0 self.totaldamage = 0 self.slimelevel = 1 self.hunger = 0 self.inebriation = 0 self.ghostbust = False # Clear weapon and weaponskill. self.weapon = "" self.weaponskill = 0 ewutils.weaponskills_clear(id_server=self.id_server, id_user=self.id_user) ewstats.clear_on_death(id_server=self.id_server, id_user=self.id_user) ewitem.item_destroyall(id_server=self.id_server, id_user=self.id_user)
def process_poudrins_looted(id_server=None, id_user=None, value=None): poudrin_amount = ewitem.find_poudrin(id_user=id_user, id_server=id_user) ewstats.track_maximum(id_user=id_user, id_server=id_server, metric=ewcfg.stat_max_poudrins, value=poudrin_amount) ewstats.change_stat(id_user=id_user, id_server=id_server, metric=ewcfg.stat_lifetime_poudrins, n=value)
def process_poudrins_looted(id_server=None, id_user=None, value=None): poudrins = ewitem.inventory(id_user=id_user, id_server=id_server, item_type_filter=ewcfg.it_slimepoudrin) poudrins_count = len(poudrins) ewstats.track_maximum(id_user=id_user, id_server=id_server, metric=ewcfg.stat_max_poudrins, value=poudrins_count) ewstats.change_stat(id_user=id_user, id_server=id_server, metric=ewcfg.stat_lifetime_poudrins, n=value)
def item_loot(member=None, id_user_target=""): if member == None or len(id_user_target) == 0: return try: # Get database handles if they weren't passed. conn_info = ewutils.databaseConnect() conn = conn_info.get('conn') cursor = conn.cursor() # TODO more elegant solution for tracking this sort of thing -- get amount of poudrins taken for stat tracking cursor.execute( "SELECT * FROM items WHERE {id_server} = %s AND {id_user} = %s AND {item_type} = %s" .format( id_user=ewcfg.col_id_user, id_server=ewcfg.col_id_server, item_type=ewcfg.col_item_type, ), (member.server.id, member.id, ewcfg.it_slimepoudrin)) poudrins_looted = cursor.rowcount ewutils.logMsg( "Attempting to loot {} poudrins.".format(poudrins_looted)) ewstats.change_stat(id_server=member.server.id, id_user=id_user_target, metric=ewcfg.stat_poudrins_looted, n=poudrins_looted) # only drop poudrins and adorned cosmetics # there's probably a more elegant way of doing this but this works query = "UPDATE items, items_prop SET {id_user} = %s WHERE {id_server} = %s AND {id_user} = %s AND {soulbound} = 0 AND items_prop.id_item = items.id_item AND ({item_type} = %s OR" " \ " "({item_type} = %s AND {name} = 'adorned' AND {value} = 'true'))".format( id_user=ewcfg.col_id_user, id_server=ewcfg.col_id_server, soulbound=ewcfg.col_soulbound, item_type=ewcfg.col_item_type, name=ewcfg.col_name, value=ewcfg.col_value) # Re-assign lootable items to looting user cursor.execute(query, (id_user_target, member.server.id, member.id, ewcfg.it_slimepoudrin, ewcfg.it_cosmetic)) conn.commit() finally: # Clean up the database handles. cursor.close() ewutils.databaseClose(conn_info)
def item_loot(member=None, id_user_target=""): if member == None or len(id_user_target) == 0: return try: # Get database handles if they weren't passed. conn_info = ewutils.databaseConnect() conn = conn_info.get('conn') cursor = conn.cursor() # TODO more elegant solution for tracking this sort of thing -- get amount of poudrins taken for stat tracking cursor.execute( "SELECT * FROM items WHERE {id_server} = %s AND {id_user} = %s AND {item_type} = %s" .format( id_user=ewcfg.col_id_user, id_server=ewcfg.col_id_server, item_type=ewcfg.col_item_type, ), (member.server.id, member.id, ewcfg.it_slimepoudrin)) poudrins_looted = cursor.rowcount ewutils.logMsg( "Attempting to loot {} poudrins.".format(poudrins_looted)) ewstats.change_stat(id_server=member.server.id, id_user=id_user_target, metric=ewcfg.stat_poudrins_looted, n=poudrins_looted) # Re-assign lootable items to looting user cursor.execute( "UPDATE items SET {id_user} = %s WHERE {id_server} = %s AND {id_user} = %s AND {soulbound} = 0" .format( id_user=ewcfg.col_id_user, id_server=ewcfg.col_id_server, soulbound=ewcfg.col_soulbound, ), (id_user_target, member.server.id, member.id)) conn.commit() finally: # Clean up the database handles. cursor.close() ewutils.databaseClose(conn_info)
def change_slimecredit(self, n=0, coinsource=None): change = int(n) self.slimecredit += change if change >= 0: ewstats.track_maximum(user=self, metric=ewcfg.stat_max_slimecredit, value=self.slimecredit) ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_slimecredit, n=change) if coinsource == ewcfg.coinsource_bounty: ewstats.change_stat(user=self, metric=ewcfg.stat_bounty_collected, n=change) if coinsource == ewcfg.coinsource_casino: ewstats.track_maximum(user=self, metric=ewcfg.stat_biggest_casino_win, value=change) ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_casino_winnings, n=change) else: change *= -1 if coinsource == ewcfg.coinsource_revival: ewstats.change_stat( user=self, metric=ewcfg.stat_slimecredit_spent_on_revives, n=change) if coinsource == ewcfg.coinsource_casino: ewstats.track_maximum(user=self, metric=ewcfg.stat_biggest_casino_loss, value=change) ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_casino_losses, n=change)
async def mine(cmd): market_data = EwMarket(id_server=cmd.message.author.server.id) user_data = EwUser(member=cmd.message.author) mutations = user_data.get_mutations() time_now = int(time.time()) response = "" # Kingpins can't mine. if user_data.life_state == ewcfg.life_state_kingpin or user_data.life_state == ewcfg.life_state_grandfoe: return # ghosts cant mine (anymore) if user_data.life_state == ewcfg.life_state_corpse: return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage( cmd.message.author, "You can't mine while you're dead. Try {}.".format( ewcfg.cmd_revive))) # Enlisted players only mine at certain times. if user_data.life_state == ewcfg.life_state_enlisted: if user_data.faction == ewcfg.faction_rowdys and ( market_data.clock < 8 or market_data.clock > 17): return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage( cmd.message.author, "Rowdies only mine in the daytime. Wait for full daylight at 8am." .format(ewcfg.cmd_revive))) if user_data.faction == ewcfg.faction_killers and ( market_data.clock < 20 and market_data.clock > 5): return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage( cmd.message.author, "Killers only mine under cover of darkness. Wait for nightfall at 8pm." .format(ewcfg.cmd_revive))) # Mine only in the mines. if cmd.message.channel.name in [ ewcfg.channel_mines, ewcfg.channel_cv_mines, ewcfg.channel_tt_mines ]: if user_data.hunger >= user_data.get_hunger_max(): return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage( cmd.message.author, "You've exhausted yourself from mining. You'll need some refreshment before getting back to work." )) else: printgrid = False hunger_cost_mod = ewutils.hunger_cost_mod(user_data.slimelevel) extra = hunger_cost_mod - int( hunger_cost_mod ) # extra is the fractional part of hunger_cost_mod if user_data.poi not in mines_map: response = "You can't mine here! Go to the mines in Juvie's Row, Toxington, or Cratersville!" return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) elif user_data.id_server not in mines_map.get(user_data.poi): init_grid(user_data.poi, user_data.id_server) printgrid = True grid_cont = mines_map.get(user_data.poi).get(user_data.id_server) grid = grid_cont.grid #minesweeper = False if cmd.tokens_count < 2: response = "Please specify which vein to mine." await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) return await print_grid(cmd) else: #minesweeper = True #grid_multiplier = grid_cont.cells_mined ** 0.4 #flag = False row = -1 col = -1 for token in cmd.tokens[1:]: if token.lower() == "reset": user_data.hunger += ewcfg.hunger_perminereset * int( hunger_cost_mod) if random.random() < extra: user_data.hunger += ewcfg.hunger_perminereset user_data.persist() init_grid(user_data.poi, user_data.id_server) return await print_grid(cmd) if row < 1 or col < 1: coords = token.lower() for char in coords: if char in ewcfg.alphabet: col = ewcfg.alphabet.index(char) coords = coords.replace(char, "") try: row = int(coords) except: row = -1 row -= 1 if row not in range(len(grid)) or col not in range( len(grid[row])): response = "Invalid vein." await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) return await print_grid(cmd) mining_yield = 0 mining_accident = False slimes_pertile = ewcfg.slimes_pertile for current_row in range(max(0, row - 1), min(row + 2, len(grid))): for current_col in range( max(0, col - 1), min(col + 2, len(grid[current_row]))): symbol_prev = get_cell_symbol( grid[current_row][current_col]) slimes_fromtile = slimes_pertile if current_row == row and current_col == col: slimes_fromtile *= 2 mining_yield += max( 0, min(slimes_fromtile, grid[current_row][current_col])) grid[current_row][current_col] -= slimes_fromtile if grid[current_row][ current_col] < -60 * ewcfg.slimes_pertile: mining_accident = True if get_cell_symbol( grid[current_row][current_col]) != symbol_prev: printgrid = True if mining_accident: user_data.change_slimes(n=-(user_data.slimes * 0.5)) user_data.persist() init_grid(user_data.poi, user_data.id_server) response = "You have lost an arm and a leg in a mining accident. Tis but a scratch." await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) return await print_grid(cmd) if mining_yield == 0: user_data.hunger += ewcfg.hunger_permine * int( hunger_cost_mod) user_data.persist() response = "This vein has already been mined dry." await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) if printgrid: return await print_grid(cmd) else: return has_pickaxe = False if user_data.weapon >= 0: weapon_item = EwItem(id_item=user_data.weapon) weapon = ewcfg.weapon_map.get( weapon_item.item_props.get("weapon_type")) if weapon.id_weapon == ewcfg.weapon_id_pickaxe: has_pickaxe = True # Determine if an item is found. unearthed_item = False unearthed_item_amount = 0 # juvies get items 4 times as often as enlisted players unearthed_item_chance = 1 / ewcfg.unearthed_item_rarity if user_data.life_state == ewcfg.life_state_juvenile: unearthed_item_chance *= 2 if has_pickaxe == True: unearthed_item_chance *= 1.5 if ewcfg.mutation_id_lucky in mutations: unearthed_item_chance *= 1.33 if random.random() < unearthed_item_chance: unearthed_item = True unearthed_item_amount = 1 if random.randint( 1, 3) != 1 else 2 # 33% chance of extra drop if unearthed_item == True: # If there are multiple possible products, randomly select one. item = random.choice(ewcfg.mine_results) item_props = ewitem.gen_item_props(item) for creation in range(unearthed_item_amount): ewitem.item_create(item_type=item.item_type, id_user=cmd.message.author.id, id_server=cmd.message.server.id, item_props=item_props) if unearthed_item_amount == 1: response = "You unearthed a {}! ".format(item.str_name) elif unearthed_item_amount == 2: response = "You unearthed two (2) {}! ".format( item.str_name) ewstats.change_stat(user=user_data, metric=ewcfg.stat_lifetime_poudrins, n=unearthed_item_amount) ewutils.logMsg('{} has found {} {}(s)!'.format( cmd.message.author.display_name, item.str_name, unearthed_item_amount)) user_initial_level = user_data.slimelevel # Add mined slime to the user. slime_bylevel = ewutils.slime_bylevel(user_data.slimelevel) #mining_yield = math.floor((slime_bylevel / 10) + 1) #alternate_yield = math.floor(200 + slime_bylevel ** (1 / math.e)) #mining_yield = min(mining_yield, alternate_yield) if has_pickaxe == True: mining_yield *= 2 # Fatigue the miner. user_data.hunger += ewcfg.hunger_permine * int(hunger_cost_mod) if extra > 0: # if hunger_cost_mod is not an integer # there's an x% chance that an extra stamina is deducted, where x is the fractional part of hunger_cost_mod in percent (times 100) if random.randint(1, 100) <= extra * 100: user_data.hunger += ewcfg.hunger_permine levelup_response = user_data.change_slimes( n=mining_yield, source=ewcfg.source_mining) was_levelup = True if user_initial_level < user_data.slimelevel else False # Tell the player their slime level increased and/or they unearthed an item. if was_levelup: response += levelup_response user_data.persist() if printgrid: await print_grid(cmd) else: response = "You can't mine here! Go to the mines in Juvie's Row, Toxington, or Cratersville!" if len(response) > 0: await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def attack(cmd): time_now = int(time.time()) response = "" deathreport = "" coinbounty = 0 user_data = EwUser(member=cmd.message.author) slimeoid = EwSlimeoid(member=cmd.message.author) weapon = ewcfg.weapon_map.get(user_data.weapon) if ewmap.channel_name_is_poi(cmd.message.channel.name) == False: response = "You can't commit violence from here." elif ewmap.poi_is_pvp(user_data.poi) == False: response = "You must go elsewhere to commit gang violence." elif cmd.mentions_count > 1: response = "One shot at a time!" elif cmd.mentions_count <= 0: response = "Your bloodlust is appreciated, but ENDLESS WAR didn't understand that name." elif user_data.hunger >= ewutils.hunger_max_bylevel(user_data.slimelevel): response = "You are too exhausted for gang violence right now. Go get some grub!" elif cmd.mentions_count == 1: # Get shooting player's info if user_data.slimelevel <= 0: user_data.slimelevel = 1 user_data.persist() # Get target's info. member = cmd.mentions[0] shootee_data = EwUser(member=member) shootee_slimeoid = EwSlimeoid(member=member) miss = False crit = False strikes = 0 slimes_spent = int(ewutils.slime_bylevel(user_data.slimelevel) / 20) slimes_damage = int( (slimes_spent * 4) * (100 + (user_data.weaponskill * 10)) / 100.0) if weapon is None: slimes_damage /= 2 # penalty for not using a weapon, otherwise fists would be on par with other weapons slimes_dropped = shootee_data.totaldamage + shootee_data.slimes #fumble_chance = (random.randrange(10) - 4) #if fumble_chance > user_data.weaponskill: #miss = True user_iskillers = user_data.life_state == ewcfg.life_state_enlisted and user_data.faction == ewcfg.faction_killers user_isrowdys = user_data.life_state == ewcfg.life_state_enlisted and user_data.faction == ewcfg.faction_rowdys if shootee_data.life_state == ewcfg.life_state_kingpin: # Disallow killing generals. response = "He is hiding in his ivory tower and playing video games like a retard." elif (slimes_spent > user_data.slimes): # Not enough slime to shoot. response = "You don't have enough slime to attack. ({:,}/{:,})".format( user_data.slimes, slimes_spent) elif (time_now - user_data.time_lastkill) < ewcfg.cd_kill: # disallow kill if the player has killed recently response = "Take a moment to appreciate your last slaughter." elif shootee_data.poi != user_data.poi: response = "You can't reach them from where you are." elif ewmap.poi_is_pvp(shootee_data.poi) == False: response = "{} is not mired in the ENDLESS WAR right now.".format( member.display_name) elif user_iskillers == False and user_isrowdys == False: # Only killers, rowdys, the cop killer, and rowdy f****r can shoot people. if user_data.life_state == ewcfg.life_state_juvenile: response = "Juveniles lack the moral fiber necessary for violence." else: response = "You lack the moral fiber necessary for violence." elif (time_now - shootee_data.time_lastrevive) < ewcfg.invuln_onrevive: # User is currently invulnerable. response = "{} has died too recently and is immune.".format( member.display_name) elif shootee_data.life_state == ewcfg.life_state_corpse and user_data.ghostbust == True: # Attack a ghostly target was_busted = False #hunger drain user_data.hunger += ewcfg.hunger_pershot * ewutils.hunger_cost_mod( user_data.slimelevel) # Weaponized flavor text. randombodypart = ewcfg.hitzone_list[random.randrange( len(ewcfg.hitzone_list))] # Weapon-specific adjustments if weapon != None and weapon.fn_effect != None: # Build effect container ctn = EwEffectContainer(miss=miss, crit=crit, slimes_damage=slimes_damage, slimes_spent=slimes_spent, user_data=user_data, shootee_data=shootee_data) # Make adjustments weapon.fn_effect(ctn) # Apply effects for non-reference values miss = ctn.miss crit = ctn.crit slimes_damage = ctn.slimes_damage slimes_spent = ctn.slimes_spent strikes = ctn.strikes # user_data and shootee_data should be passed by reference, so there's no need to assign them back from the effect container. if miss: slimes_damage = 0 # Remove !revive invulnerability. user_data.time_lastrevive = 0 # Spend slimes, to a minimum of zero user_data.change_slimes( n=(-user_data.slimes if slimes_spent >= user_data.slimes else -slimes_spent), source=ewcfg.source_spending) # Damage stats ewstats.track_maximum(user=user_data, metric=ewcfg.stat_max_hitdealt, value=slimes_damage) ewstats.change_stat(user=user_data, metric=ewcfg.stat_lifetime_damagedealt, n=slimes_damage) # Remove repeat killing protection if. if user_data.id_killer == shootee_data.id_user: user_data.id_killer = "" if slimes_damage >= -shootee_data.slimes: was_busted = True if was_busted: # Move around slime as a result of the shot. user_data.change_slimes(n=ewutils.slime_bylevel( shootee_data.slimelevel), source=ewcfg.source_busting) coinbounty = int(shootee_data.bounty / ewcfg.slimecoin_exchangerate) user_data.change_slimecredit( n=coinbounty, coinsource=ewcfg.coinsource_bounty) ewstats.track_maximum(user=user_data, metric=ewcfg.stat_biggest_bust_level, value=shootee_data.slimelevel) # Player was busted. shootee_data.die(cause=ewcfg.cause_busted) response = "{name_target}\'s ghost has been **BUSTED**!!".format( name_target=member.display_name) deathreport = "Your ghost has been busted by {}. {}".format( cmd.message.author.display_name, ewcfg.emote_bustin) deathreport = "{} ".format( ewcfg.emote_bustin) + ewutils.formatMessage( member, deathreport) if coinbounty > 0: response += "\n\n SlimeCorp transfers {} SlimeCoin to {}\'s account.".format( str(coinbounty), cmd.message.author.display_name) #adjust busts ewstats.increment_stat(user=user_data, metric=ewcfg.stat_ghostbusts) else: # A non-lethal blow! shootee_data.change_slimes(n=slimes_damage, source=ewcfg.source_busting) damage = str(slimes_damage) if weapon != None: if miss: response = "{}".format( weapon.str_miss.format( name_player=cmd.message.author.display_name, name_target=member.display_name + "\'s ghost")) else: response = weapon.str_damage.format( name_player=cmd.message.author.display_name, name_target=member.display_name + "\'s ghost", hitzone=randombodypart, strikes=strikes) if crit: response += " {}".format( weapon.str_crit.format( name_player=cmd.message.author. display_name, name_target=member.display_name + "\'s ghost")) response += " {target_name} loses {damage} antislime!".format( target_name=(member.display_name + "\'s ghost"), damage=damage) else: if miss: response = "{}\'s ghost is unharmed.".format( member.display_name) else: response = "{target_name} is hit!! {target_name} loses {damage} antislime!".format( target_name=(member.display_name + "\'s ghost"), damage=damage) # Persist every users' data. user_data.persist() shootee_data.persist() await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.server.get_member( shootee_data.id_user)) elif shootee_data.life_state == ewcfg.life_state_corpse and shootee_data.busted == True: # Target is already dead and not a ghost. response = "{} is already dead.".format(member.display_name) elif shootee_data.life_state == ewcfg.life_state_corpse and user_data.ghostbust == False: # Target is a ghost but user is not able to bust response = "You don't know how to fight a ghost." else: # Slimes from this shot might be awarded to the boss. role_boss = (ewcfg.role_copkiller if user_iskillers else ewcfg.role_rowdyfucker) boss_slimes = 0 user_inital_level = user_data.slimelevel was_juvenile = False was_killed = False was_shot = False if (shootee_data.life_state == ewcfg.life_state_enlisted) or ( shootee_data.life_state == ewcfg.life_state_juvenile): # User can be shot. if shootee_data.life_state == ewcfg.life_state_juvenile: was_juvenile = True was_shot = True if was_shot: #hunger drain user_data.hunger += ewcfg.hunger_pershot * ewutils.hunger_cost_mod( user_data.slimelevel) # Weaponized flavor text. randombodypart = ewcfg.hitzone_list[random.randrange( len(ewcfg.hitzone_list))] # Weapon-specific adjustments if weapon != None and weapon.fn_effect != None: # Build effect container ctn = EwEffectContainer(miss=miss, crit=crit, slimes_damage=slimes_damage, slimes_spent=slimes_spent, user_data=user_data, shootee_data=shootee_data) # Make adjustments weapon.fn_effect(ctn) # Apply effects for non-reference values miss = ctn.miss crit = ctn.crit slimes_damage = ctn.slimes_damage slimes_spent = ctn.slimes_spent strikes = ctn.strikes # user_data and shootee_data should be passed by reference, so there's no need to assign them back from the effect container. if miss: slimes_damage = 0 # Remove !revive invulnerability. user_data.time_lastrevive = 0 # Spend slimes, to a minimum of zero user_data.change_slimes( n=(-user_data.slimes if slimes_spent >= user_data.slimes else -slimes_spent), source=ewcfg.source_spending) # Damage stats ewstats.track_maximum(user=user_data, metric=ewcfg.stat_max_hitdealt, value=slimes_damage) ewstats.change_stat(user=user_data, metric=ewcfg.stat_lifetime_damagedealt, n=slimes_damage) # Remove repeat killing protection if. if user_data.id_killer == shootee_data.id_user: user_data.id_killer = "" if slimes_damage >= shootee_data.slimes: was_killed = True if was_killed: #adjust statistics ewstats.increment_stat(user=user_data, metric=ewcfg.stat_kills) ewstats.track_maximum(user=user_data, metric=ewcfg.stat_biggest_kill, value=int(slimes_dropped)) if user_data.slimelevel > shootee_data.slimelevel: ewstats.increment_stat( user=user_data, metric=ewcfg.stat_lifetime_ganks) elif user_data.slimelevel < shootee_data.slimelevel: ewstats.increment_stat( user=user_data, metric=ewcfg.stat_lifetime_takedowns) # Collect bounty coinbounty = int( shootee_data.bounty / ewcfg.slimecoin_exchangerate) # 100 slime per coin # Move around slime as a result of the shot. if shootee_data.slimes >= 0: if was_juvenile: user_data.change_slimes( n=slimes_dropped, source=ewcfg.source_killing) else: user_data.change_slimecredit( n=coinbounty, coinsource=ewcfg.coinsource_bounty) user_data.change_slimes( n=slimes_dropped / 2, source=ewcfg.source_killing) boss_slimes += int(slimes_dropped / 2) # Steal items ewitem.item_loot(member=member, id_user_target=cmd.message.author.id) #add bounty user_data.add_bounty(n=(shootee_data.bounty / 2) + (slimes_dropped / 4)) # Give a bonus to the player's weapon skill for killing a stronger player. if shootee_data.slimelevel >= user_data.slimelevel: user_data.add_weaponskill(n=1) # Player was killed. shootee_data.id_killer = user_data.id_user shootee_data.die(cause=ewcfg.cause_killing) shootee_data.change_slimes( n=-slimes_dropped / 10, source=ewcfg.source_ghostification) kill_descriptor = "beaten to death" if weapon != None: response = weapon.str_damage.format( name_player=cmd.message.author.display_name, name_target=member.display_name, hitzone=randombodypart, strikes=strikes) kill_descriptor = weapon.str_killdescriptor if crit: response += " {}".format( weapon.str_crit.format( name_player=cmd.message.author. display_name, name_target=member.display_name)) response += "\n\n{}".format( weapon.str_kill.format( name_player=cmd.message.author.display_name, name_target=member.display_name, emote_skull=ewcfg.emote_slimeskull)) shootee_data.trauma = weapon.id_weapon if slimeoid.level == ewcfg.slimeoid_state_active: brain = ewcfg.brain_map.get(slimeoid.ai) response += "\n\n{}" + brain.str_kill.format( slimeoid_name=shootee_slimeoid.name) if shootee_slimeoid.level == ewcfg.slimeoid_state_active: brain = ewcfg.brain_map.get(shootee_slimeoid.ai) response += "\n\n{}" + brain.str_death.format( slimeoid_name=shootee_slimeoid.name) else: response = "{name_target} is hit!!\n\n{name_target} has died.".format( name_target=member.display_name) shootee_data.trauma = "" if slimeoid.life_state == ewcfg.slimeoid_state_active: brain = ewcfg.brain_map.get(slimeoid.ai) response += "\n\n" + brain.str_kill.format( slimeoid_name=shootee_slimeoid.name) if shootee_slimeoid.life_state == ewcfg.slimeoid_state_active: brain = ewcfg.brain_map.get(shootee_slimeoid.ai) response += "\n\n" + brain.str_death.format( slimeoid_name=shootee_slimeoid.name) deathreport = "You were {} by {}. {}".format( kill_descriptor, cmd.message.author.display_name, ewcfg.emote_slimeskull) deathreport = "{} ".format( ewcfg.emote_slimeskull) + ewutils.formatMessage( member, deathreport) if coinbounty > 0: response += "\n\n SlimeCorp transfers {} SlimeCoin to {}\'s account.".format( str(coinbounty), cmd.message.author.display_name) else: # A non-lethal blow! shootee_data.change_slimes(n=-slimes_damage, source=ewcfg.source_damage) damage = str(slimes_damage) if weapon != None: if miss: response = "{}".format( weapon.str_miss.format( name_player=cmd.message.author. display_name, name_target=member.display_name)) else: response = weapon.str_damage.format( name_player=cmd.message.author.display_name, name_target=member.display_name, hitzone=randombodypart, strikes=strikes) if crit: response += " {}".format( weapon.str_crit.format( name_player=cmd.message.author. display_name, name_target=member.display_name)) response += " {target_name} loses {damage} slime!".format( target_name=member.display_name, damage=damage) else: # unarmed attacks have no miss or crit chance response = "{target_name} is hit!! {target_name} loses {damage} slime!".format( target_name=member.display_name, damage=damage) else: response = 'You are unable to attack {}.'.format( member.display_name) # Add level up text to response if appropriate if user_inital_level < user_data.slimelevel: response += "\n\n{} has been empowered by slime and is now a level {} slimeboi!".format( cmd.message.author.display_name, user_data.slimelevel) # # Give slimes to the boss if possible. # boss_member = None # if boss_slimes > 0: # for member_search in cmd.message.server.members: # if role_boss in ewutils.getRoleMap(member_search.roles): # boss_member = member_search # break # if boss_member != None: # boss_data = EwUser(member = boss_member) # boss_data.change_slimes(n = boss_slimes) # boss_data.persist() kingpin = ewutils.find_kingpin(id_server=cmd.message.server.id, kingpin_role=role_boss) if kingpin: kingpin.change_slimes(n=boss_slimes) kingpin.persist() # Persist every users' data. user_data.persist() shootee_data.persist() # Assign the corpse role to the newly dead player. if was_killed: await ewrolemgr.updateRoles(client=cmd.client, member=member) # Send the response to the player. await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) if deathreport != "": sewerchannel = ewutils.get_channel(cmd.message.server, ewcfg.channel_sewers) await cmd.client.send_message(sewerchannel, deathreport)
async def capture_tick(id_server): # the variables might apparently be accessed before assignment if i didn't declare them here cursor = None conn_info = None resp_cont_capture_tick = ewutils.EwResponseContainer(client = ewutils.get_client(), id_server = id_server) all_districts = ewcfg.capturable_districts if len(all_districts) > 0: # if all_districts isn't empty server = ewcfg.server_list[id_server] time_old = time.time() for district in all_districts: district_name = district dist = EwDistrict(id_server = id_server, district = district_name) if dist.time_unlock > 0 and not dist.all_neighbors_friendly(): responses = dist.change_capture_lock(progress = -ewcfg.capture_tick_length) resp_cont_capture_tick.add_response_container(responses) dist.persist() if dist.time_unlock > 0: continue # no more automatic capping continue controlling_faction = dist.controlling_faction gangsters_in_district = dist.get_players_in_district(min_slimes = ewcfg.min_slime_to_cap, life_states = [ewcfg.life_state_enlisted], ignore_offline = True) slimeoids = ewutils.get_slimeoids_in_poi(poi = district_name, id_server = id_server, sltype = ewcfg.sltype_nega) nega_present = len(slimeoids) > 0 # if nega_present: # continue # the faction that's actively capturing the district this tick # if no players are present, it's None, if only players of one faction (ignoring juvies and ghosts) are, # it's the faction's name, i.e. 'rowdys' or 'killers', and if both are present, it's 'both' faction_capture = None # how much progress will be made. is higher the more people of one faction are in a district, and is 0 if both teams are present capture_speed = 0 # number of players actively capturing num_capturers = 0 dc_stat_increase_list = [] # checks if any players are in the district and if there are only players of the same faction, i.e. progress can happen for player in gangsters_in_district: player_id = player user_data = EwUser(id_user = player_id, id_server = id_server) player_faction = user_data.faction mutations = user_data.get_mutations() try: player_online = server.get_member(player_id).status != discord.Status.offline except: player_online = False #ewutils.logMsg("Online status checked. Time elapsed: %f" % (time.time() - time_old) + " Server: %s" % id_server + " Player: %s" % player_id + " Status: %s" % ("online" if player_online else "offline")) if player_online: if faction_capture not in [None, player_faction]: # if someone of the opposite faction is in the district faction_capture = 'both' # standstill, gang violence has to happen capture_speed = 0 num_capturers = 0 dc_stat_increase_list.clear() else: # if the district isn't already controlled by the player's faction and the capture isn't halted by an enemy faction_capture = player_faction player_capture_speed = 1 if ewcfg.mutation_id_lonewolf in mutations and len(gangsters_in_district) == 1: player_capture_speed *= 2 if ewcfg.mutation_id_patriot in mutations: player_capture_speed *= 2 capture_speed += player_capture_speed num_capturers += 1 dc_stat_increase_list.append(player_id) if faction_capture not in ['both', None]: # if only members of one faction is present if district_name in ewcfg.capturable_districts: friendly_neighbors = dist.get_number_of_friendly_neighbors() if dist.all_neighbors_friendly(): capture_speed = 0 elif dist.controlling_faction == faction_capture: capture_speed *= 1 + 0.1 * friendly_neighbors else: capture_speed /= 1 + 0.1 * friendly_neighbors capture_progress = dist.capture_points if faction_capture != dist.capturing_faction: capture_progress *= -1 capture_speed *= ewcfg.baseline_capture_speed if dist.capture_points < dist.max_capture_points: for stat_recipient in dc_stat_increase_list: ewstats.change_stat( id_server = id_server, id_user = stat_recipient, metric = ewcfg.stat_capture_points_contributed, n = ewcfg.capture_tick_length * capture_speed ) if faction_capture == dist.capturing_faction: # if the faction is already in the process of capturing, continue responses = dist.change_capture_points(ewcfg.capture_tick_length * capture_speed, faction_capture, num_capturers) resp_cont_capture_tick.add_response_container(responses) elif dist.capture_points == 0 and dist.controlling_faction == "": # if it's neutral, start the capture responses = dist.change_capture_points(ewcfg.capture_tick_length * capture_speed, faction_capture, num_capturers) resp_cont_capture_tick.add_response_container(responses) dist.capturing_faction = faction_capture # lower the enemy faction's progress to revert it to neutral (or potentially get it onto your side without becoming neutral first) else: # if the (de-)capturing faction is not in control responses = dist.change_capture_points(-(ewcfg.capture_tick_length * capture_speed * ewcfg.decapture_speed_multiplier), faction_capture) resp_cont_capture_tick.add_response_container(responses) dist.persist()
def change_slimecoin(self, n = 0, coinsource = None): change = int(n) self.slimecoin += change if change >= 0: ewstats.track_maximum(user = self, metric = ewcfg.stat_max_slimecoin, value = self.slimecoin) ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimecoin, n = change) if coinsource == ewcfg.coinsource_bounty: ewstats.change_stat(user = self, metric = ewcfg.stat_bounty_collected, n = change) if coinsource == ewcfg.coinsource_casino: ewstats.track_maximum(user = self, metric = ewcfg.stat_biggest_casino_win, value = change) ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_casino_winnings, n = change) if coinsource == ewcfg.coinsource_withdraw: ewstats.change_stat(user = self, metric = ewcfg.stat_total_slimecoin_withdrawn, n = change) if coinsource == ewcfg.coinsource_recycle: ewstats.change_stat(user = self, metric = ewcfg.stat_total_slimecoin_from_recycling, n = change) else: change *= -1 if coinsource == ewcfg.coinsource_revival: ewstats.change_stat(user = self, metric = ewcfg.stat_slimecoin_spent_on_revives, n = change) if coinsource == ewcfg.coinsource_casino: ewstats.track_maximum(user = self, metric = ewcfg.stat_biggest_casino_loss, value = change) ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_casino_losses, n = change) if coinsource == ewcfg.coinsource_invest: ewstats.change_stat(user = self, metric = ewcfg.stat_total_slimecoin_invested, n = change) if coinsource == ewcfg.coinsource_swearjar: ewstats.change_stat(user = self, metric = ewcfg.stat_total_slimecoin_from_swearing, n = change)
def die(self, cause = None): time_now = int(time.time()) ewutils.end_trade(self.id_user) resp_cont = ewutils.EwResponseContainer(id_server = self.id_server) client = ewcfg.get_client() server = client.get_server(self.id_server) deathreport = '' # remove ghosts inhabiting player self.remove_inhabitation() # Make The death report deathreport = ewutils.create_death_report(cause = cause, user_data = self) resp_cont.add_channel_response(ewcfg.channel_sewers, deathreport) poi = ewcfg.id_to_poi.get(self.poi) if cause == ewcfg.cause_weather: resp_cont.add_channel_response(poi.channel, deathreport) # Grab necessary data for spontaneous combustion before stat reset explosion_block_list = [ewcfg.cause_leftserver, ewcfg.cause_cliff] user_hasCombustion = False if (cause not in explosion_block_list) and (poi.pvp): if ewcfg.mutation_id_spontaneouscombustion in self.get_mutations(): user_hasCombustion = True explode_damage = ewutils.slime_bylevel(self.slimelevel) / 5 explode_district = ewdistrict.EwDistrict(district = self.poi, id_server = self.id_server) explode_poi_channel = ewcfg.id_to_poi.get(self.poi).channel if cause == ewcfg.cause_busted: self.busted = True self.poi = ewcfg.poi_id_thesewers #self.slimes = int(self.slimes * 0.9) else: self.busted = False # reset busted state on normal death; potentially move this to ewspooky.revive self.slimes = 0 self.slimelevel = 1 self.clear_mutations() self.clear_allstatuses() self.totaldamage = 0 self.bleed_storage = 0 self.hunger = 0 self.inebriation = 0 self.bounty = 0 self.time_lastdeath = time_now # if self.life_state == ewcfg.life_state_shambler: # self.degradation += 1 # else: # self.degradation += 5 ewstats.increment_stat(user = self, metric = ewcfg.stat_lifetime_deaths) ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimeloss, n = self.slimes) if cause == ewcfg.cause_cliff: pass else: if self.life_state == ewcfg.life_state_juvenile: # If you were a Juvenile. item_fraction = 4 food_fraction = 4 cosmetic_fraction = 4 else: # If you were a Gangster. item_fraction = 2 food_fraction = 2 cosmetic_fraction = 2 self.slimecoin = int(self.slimecoin) - (int(self.slimecoin) / 10) ewitem.item_dropsome(id_server = self.id_server, id_user = self.id_user, item_type_filter = ewcfg.it_item, fraction = item_fraction) # Drop a random fraction of your items on the ground. ewitem.item_dropsome(id_server = self.id_server, id_user = self.id_user, item_type_filter = ewcfg.it_food, fraction = food_fraction) # Drop a random fraction of your food on the ground. ewitem.item_dropsome(id_server = self.id_server, id_user = self.id_user, item_type_filter = ewcfg.it_cosmetic, fraction = cosmetic_fraction) # Drop a random fraction of your unadorned cosmetics on the ground. ewitem.item_dedorn_cosmetics(id_server = self.id_server, id_user = self.id_user) # Unadorn all of your adorned hats. self.freshness = 0 ewitem.item_dropsome(id_server = self.id_server, id_user = self.id_user, item_type_filter = ewcfg.it_weapon, fraction = 1) # Drop random fraction of your unequipped weapons on the ground. ewutils.weaponskills_clear(id_server = self.id_server, id_user = self.id_user, weaponskill = ewcfg.weaponskill_max_onrevive) self.life_state = ewcfg.life_state_corpse self.poi_death = self.poi self.poi = ewcfg.poi_id_thesewers self.weapon = -1 self.time_expirpvp = 0 if cause == ewcfg.cause_killing_enemy: # If your killer was an Enemy. Duh. ewstats.increment_stat(user = self, metric = ewcfg.stat_lifetime_pve_deaths) if cause == ewcfg.cause_leftserver: ewitem.item_dropall(id_server=self.id_server, id_user=self.id_user) self.sap = 0 self.hardened_sap = 0 self.attack = 0 self.defense = 0 self.speed = 0 ewutils.moves_active[self.id_user] = 0 ewutils.active_target_map[self.id_user] = "" ewutils.active_restrictions[self.id_user] = 0 ewstats.clear_on_death(id_server = self.id_server, id_user = self.id_user) self.persist() if cause not in explosion_block_list: # Run explosion after location/stat reset, to prevent looping onto self if user_hasCombustion: explode_resp = "\n{} spontaneously combusts, horribly dying in a fiery explosion of slime and shrapnel!! Oh, the humanity!\n".format(server.get_member(self.id_user).display_name) ewutils.logMsg("") resp_cont.add_channel_response(explode_poi_channel, explode_resp) explosion = ewutils.explode(damage = explode_damage, district_data = explode_district) resp_cont.add_response_container(explosion) #ewitem.item_destroyall(id_server = self.id_server, id_user = self.id_user) ewutils.logMsg('server {}: {} was killed by {} - cause was {}'.format(self.id_server, self.id_user, self.id_killer, cause)) return(resp_cont)
def change_slimes(self, n = 0, source = None): change = int(n) self.slimes += change response = "" if n >= 0: ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimes, n = change) ewstats.track_maximum(user = self, metric = ewcfg.stat_max_slimes, value = self.slimes) if source == ewcfg.source_mining: ewstats.change_stat(user = self, metric = ewcfg.stat_slimesmined, n = change) ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimesmined, n = change) if source == ewcfg.source_killing: ewstats.change_stat(user = self, metric = ewcfg.stat_slimesfromkills, n = change) ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimesfromkills, n = change) if source == ewcfg.source_farming: ewstats.change_stat(user = self, metric = ewcfg.stat_slimesfarmed, n = change) ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimesfarmed, n = change) if source == ewcfg.source_scavenging: ewstats.change_stat(user = self, metric = ewcfg.stat_slimesscavenged, n = change) ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimesscavenged, n = change) else: change *= -1 # convert to positive number if source != ewcfg.source_spending and source != ewcfg.source_ghostification: ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimeloss, n = change) if source == ewcfg.source_damage or source == ewcfg.source_bleeding: self.totaldamage += change ewstats.track_maximum(user = self, metric = ewcfg.stat_max_hitsurvived, value = change) if source == ewcfg.source_self_damage: self.totaldamage += change ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_selfdamage, n = change) if source == ewcfg.source_decay: ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimesdecayed, n = change) if source == ewcfg.source_haunter: ewstats.track_maximum(user = self, metric = ewcfg.stat_max_hauntinflicted, value = change) ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimeshaunted, n = change) # potentially level up new_level = ewutils.level_byslime(self.slimes) if new_level > self.slimelevel: if self.life_state != ewcfg.life_state_corpse: response += "You have been empowered by slime and are now a level {} slimeboi.".format(new_level) for level in range(self.slimelevel+1, new_level+1): current_mutations = self.get_mutations() if (level in ewcfg.mutation_milestones) and (self.life_state not in [ewcfg.life_state_corpse, ewcfg.life_state_shambler]) and (len(current_mutations) < 10): new_mutation = random.choice(list(ewcfg.mutation_ids)) while new_mutation in current_mutations: new_mutation = random.choice(list(ewcfg.mutation_ids)) add_success = self.add_mutation(new_mutation) if add_success: response += "\n\nWhat’s this? You are mutating!! {}".format(ewcfg.mutations_map[new_mutation].str_acquire) self.slimelevel = new_level if self.life_state == ewcfg.life_state_corpse: ewstats.track_maximum(user = self, metric = ewcfg.stat_max_ghost_level, value = self.slimelevel) else: ewstats.track_maximum(user = self, metric = ewcfg.stat_max_level, value = self.slimelevel) return response
def change_slimes(self, n=0, source=None): change = int(n) self.slimes += change if n >= 0: ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_slimes, n=change) ewstats.track_maximum(user=self, metric=ewcfg.stat_max_slimes, value=self.slimes) if source == ewcfg.source_mining: ewstats.change_stat(user=self, metric=ewcfg.stat_slimesmined, n=change) ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_slimesmined, n=change) if source == ewcfg.source_killing: ewstats.change_stat(user=self, metric=ewcfg.stat_slimesfromkills, n=change) ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_slimesfromkills, n=change) # todo add source from farming else: change *= -1 # convert to positive number if source != ewcfg.source_spending and source != ewcfg.source_ghostification: ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_slimeloss, n=change) if source == ewcfg.source_damage: self.totaldamage += change ewstats.track_maximum(user=self, metric=ewcfg.stat_max_hitsurvived, value=change) if source == ewcfg.source_self_damage: self.totaldamage += change ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_selfdamage, n=change) if source == ewcfg.source_decay: ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_slimesdecayed, n=change) if source == ewcfg.source_haunter: ewstats.track_maximum(user=self, metric=ewcfg.stat_max_hauntinflicted, value=change) ewstats.change_stat(user=self, metric=ewcfg.stat_lifetime_slimeshaunted, n=change) # potentially level up new_level = ewutils.level_byslime(self.slimes) if new_level > self.slimelevel: self.slimelevel = new_level if self.life_state == ewcfg.life_state_corpse: ewstats.track_maximum(user=self, metric=ewcfg.stat_max_ghost_level, value=self.slimelevel) else: ewstats.track_maximum(user=self, metric=ewcfg.stat_max_level, value=self.slimelevel)
def die(self, cause = None): time_now = int(time.time()) ewutils.end_trade(self.id_user) if cause == ewcfg.cause_busted: self.busted = True self.poi = ewcfg.poi_id_thesewers #self.slimes = int(self.slimes * 0.9) else: self.busted = False # reset busted state on normal death; potentially move this to ewspooky.revive self.slimes = 0 self.slimelevel = 1 self.clear_mutations() self.clear_allstatuses() self.totaldamage = 0 self.bleed_storage = 0 self.hunger = 0 self.inebriation = 0 self.bounty = 0 ewstats.increment_stat(user = self, metric = ewcfg.stat_lifetime_deaths) ewstats.change_stat(user = self, metric = ewcfg.stat_lifetime_slimeloss, n = self.slimes) if self.time_expirpvp >= time_now: # If you were Wanted. if cause != ewcfg.cause_cliff: ewitem.item_dropall(id_server = self.id_server, id_user = self.id_user) ewutils.weaponskills_clear(id_server = self.id_server, id_user = self.id_user, weaponskill = ewcfg.weaponskill_min_onrevive) self.slimecoin = 0 self.weaponmarried = False if cause == ewcfg.cause_cliff: pass else: if self.life_state == ewcfg.life_state_juvenile: # If you were a Juvenile. item_fraction = 4 food_fraction = 4 cosmetic_fraction = 4 else: # If you were mired in normal Gang Violence, meaning if you were a Rowdy and your killer was a Killer, or vice versa. item_fraction = 2 food_fraction = 2 cosmetic_fraction = 2 self.slimecoin = int(self.slimecoin) - (int(self.slimecoin) / 10) ewitem.item_dropsome(id_server = self.id_server, id_user = self.id_user, item_type_filter = ewcfg.it_item, fraction = item_fraction) # Drop a random fraction of your items on the ground. ewitem.item_dropsome(id_server = self.id_server, id_user = self.id_user, item_type_filter = ewcfg.it_food, fraction = food_fraction) # Drop a random fraction of your food on the ground. ewitem.item_dropsome(id_server = self.id_server, id_user = self.id_user, item_type_filter = ewcfg.it_cosmetic, fraction = cosmetic_fraction) # Drop a random fraction of your unadorned cosmetics on the ground. ewitem.item_dedorn_cosmetics(id_server = self.id_server, id_user = self.id_user) # Unadorn all of your adorned hats. ewitem.item_dropsome(id_server = self.id_server, id_user = self.id_user, item_type_filter = ewcfg.it_weapon, fraction = 1) # Drop random fraction of your unequipped weapons on the ground. ewutils.weaponskills_clear(id_server = self.id_server, id_user = self.id_user, weaponskill = ewcfg.weaponskill_max_onrevive) self.life_state = ewcfg.life_state_corpse self.poi_death = self.poi self.poi = ewcfg.poi_id_thesewers self.weapon = -1 self.time_expirpvp = 0 if cause == ewcfg.cause_killing_enemy: # If your killer was an Enemy. Duh. ewstats.increment_stat(user = self, metric = ewcfg.stat_lifetime_pve_deaths) if cause == ewcfg.cause_leftserver: ewitem.item_dropall(id_server=self.id_server, id_user=self.id_user) self.sap = 0 self.hardened_sap = 0 ewutils.moves_active[self.id_user] = 0 ewstats.clear_on_death(id_server = self.id_server, id_user = self.id_user) #ewitem.item_destroyall(id_server = self.id_server, id_user = self.id_user) ewutils.logMsg('server {}: {} was killed by {} - cause was {}'.format(self.id_server, self.id_user, self.id_killer, cause))
async def mine(cmd): market_data = EwMarket(id_server=cmd.message.author.server.id) user_data = EwUser(member=cmd.message.author) # Kingpins can't mine. if user_data.life_state == ewcfg.life_state_kingpin or user_data.life_state == ewcfg.life_state_grandfoe: return # ghosts cant mine (anymore) if user_data.life_state == ewcfg.life_state_corpse: return await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage( cmd.message.author, "You can't mine while you're dead. Try {}.".format( ewcfg.cmd_revive))) # Enlisted players only mine at certain times. if user_data.life_state == ewcfg.life_state_enlisted: if user_data.faction == ewcfg.faction_rowdys and ( market_data.clock < 8 or market_data.clock > 17): return await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage( cmd.message.author, "Rowdies only mine in the daytime. Wait for full daylight at 8am." .format(ewcfg.cmd_revive))) if user_data.faction == ewcfg.faction_killers and ( market_data.clock < 20 and market_data.clock > 5): return await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage( cmd.message.author, "Killers only mine under cover of darkness. Wait for nightfall at 8pm." .format(ewcfg.cmd_revive))) # Mine only in the mines. if cmd.message.channel.name in [ ewcfg.channel_mines, ewcfg.channel_cv_mines, ewcfg.channel_tt_mines ]: if user_data.hunger >= ewutils.hunger_max_bylevel( user_data.slimelevel): return await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage( cmd.message.author, "You've exhausted yourself from mining. You'll need some refreshment before getting back to work." )) else: # Determine if a poudrin is found. poudrin = False poudrinamount = 0 # juvies get poudrins 4 times as often as enlisted players poudrin_rarity = ewcfg.poudrin_rarity / ( 2 if user_data.life_state == ewcfg.life_state_juvenile else 1) poudrin_mined = random.randint(1, poudrin_rarity) if poudrin_mined == 1: poudrin = True poudrinamount = 1 if random.randint( 1, 3) != 1 else 2 # 33% chance of extra drop user_initial_level = user_data.slimelevel # Add mined slime to the user. slime_bylevel = ewutils.slime_bylevel(user_data.slimelevel) mining_yield = math.floor((slime_bylevel / 10) + 1) alternate_yield = math.floor(200 + slime_bylevel**(1 / math.e)) mining_yield = min(mining_yield, alternate_yield) user_data.change_slimes(n=mining_yield, source=ewcfg.source_mining) was_levelup = True if user_initial_level < user_data.slimelevel else False # Create and give slime poudrins for pdx in range(poudrinamount): item_id = ewitem.item_create( item_type=ewcfg.it_slimepoudrin, id_user=cmd.message.author.id, id_server=cmd.message.server.id, ) ewutils.logMsg( 'Created poudrin (item {}) for user (id {})'.format( item_id, cmd.message.author.id)) # Fatigue the miner. hunger_cost_mod = ewutils.hunger_cost_mod(user_data.slimelevel) extra = hunger_cost_mod - int( hunger_cost_mod ) # extra is the fractional part of hunger_cost_mod user_data.hunger += ewcfg.hunger_permine * int(hunger_cost_mod) if extra > 0: # if hunger_cost_mod is not an integer # there's an x% chance that an extra stamina is deducted, where x is the fractional part of hunger_cost_mod in percent (times 100) if random.randint(1, 100) <= extra * 100: user_data.hunger += ewcfg.hunger_permine user_data.persist() # Tell the player their slime level increased and/or a poudrin was found. if was_levelup or poudrin: response = "" if poudrin: if poudrinamount == 1: response += "You unearthed a slime poudrin! " elif poudrinamount == 2: response += "You unearthed two slime poudrins! " ewstats.change_stat(user=user_data, metric=ewcfg.stat_lifetime_poudrins, n=poudrinamount) ewutils.logMsg('{} has found {} poudrin(s)!'.format( cmd.message.author.display_name, poudrinamount)) if was_levelup: response += "You have been empowered by slime and are now a level {} slimeboi!".format( user_data.slimelevel) await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) else: return await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage(cmd.message.author, "You can't mine here. Go to the mines."))
async def burnSlimes(id_server = None): if id_server != None: time_now = int(time.time()) client = get_client() server = client.get_server(id_server) results = {} # Get users with burning effect data = execute_sql_query("SELECT {id_user}, {value}, {source} from status_effects WHERE {id_status} = %s and {id_server} = %s".format( id_user = ewcfg.col_id_user, value = ewcfg.col_value, id_status = ewcfg.col_id_status, id_server = ewcfg.col_id_server, source = ewcfg.col_source ), ( ewcfg.status_burning_id, id_server )) deathreport = "" resp_cont = EwResponseContainer(id_server = id_server) for result in data: user_data = EwUser(id_user = result[0], id_server = id_server) slimes_dropped = user_data.totaldamage + user_data.slimes # Deal 10% of total slime to burn every second slimes_to_burn = math.ceil(int(float(result[1])) * ewcfg.burn_tick_length / ewcfg.time_expire_burn) killer_data = EwUser(id_server = id_server, id_user=result[2]) # Damage stats ewstats.change_stat(user = killer_data, metric = ewcfg.stat_lifetime_damagedealt, n = slimes_to_burn) # Player died if user_data.slimes - slimes_to_burn < 0: weapon = ewcfg.weapon_map.get(ewcfg.weapon_id_molotov) player_data = EwPlayer(id_server = user_data.id_server, id_user = user_data.id_user) killer = EwPlayer(id_server = id_server, id_user=killer_data.id_user) # Kill stats ewstats.increment_stat(user = killer_data, metric = ewcfg.stat_kills) ewstats.track_maximum(user = killer_data, metric = ewcfg.stat_biggest_kill, value = int(slimes_dropped)) if killer_data.slimelevel > user_data.slimelevel: ewstats.increment_stat(user = killer_data, metric = ewcfg.stat_lifetime_ganks) elif killer_data.slimelevel < user_data.slimelevel: ewstats.increment_stat(user = killer_data, metric = ewcfg.stat_lifetime_takedowns) # Collect bounty coinbounty = int(user_data.bounty / ewcfg.slimecoin_exchangerate) # 100 slime per coin if user_data.slimes >= 0: killer_data.change_slimecoin(n = coinbounty, coinsource = ewcfg.coinsource_bounty) # Kill player user_data.id_killer = killer_data.id_user user_data.die(cause = ewcfg.cause_burning) #user_data.change_slimes(n = -slimes_dropped / 10, source = ewcfg.source_ghostification) deathreport = "You were {} by {}. {}".format(weapon.str_killdescriptor, killer.display_name, ewcfg.emote_slimeskull) deathreport = "{} ".format(ewcfg.emote_slimeskull) + formatMessage(server.get_member(user_data.id_user), deathreport) resp_cont.add_channel_response(ewcfg.channel_sewers, deathreport) user_data.trauma = weapon.id_weapon user_data.persist() await ewrolemgr.updateRoles(client = client, member = server.get_member(user_data.id_user)) else: user_data.change_slimes(n = -slimes_to_burn, source = ewcfg.source_damage) user_data.persist() await resp_cont.post()
async def capture_tick(id_server): # the variables might apparently be accessed before assignment if i didn't declare them here cursor = None conn_info = None try: conn_info = ewutils.databaseConnect() conn = conn_info.get('conn') cursor = conn.cursor() cursor.execute( "SELECT {district}, {controlling_faction}, {capturing_faction}, {capture_points} FROM districts WHERE id_server = %s" .format(district=ewcfg.col_district, controlling_faction=ewcfg.col_controlling_faction, capturing_faction=ewcfg.col_capturing_faction, capture_points=ewcfg.col_capture_points), (id_server, )) all_districts = cursor.fetchall() cursor.execute( "SELECT {poi}, {faction}, {life_state}, {id_user} FROM users WHERE id_server = %s" .format(poi=ewcfg.col_poi, faction=ewcfg.col_faction, life_state=ewcfg.col_life_state, id_user=ewcfg.col_id_user), (id_server, )) all_players = cursor.fetchall() if len(all_districts) > 0: # if all_districts isn't empty for d in range( len(all_districts)): # iterate through all districts district = all_districts[d] district_name = district[0] controlling_faction = district[1] # the faction that's actively capturing the district this tick # if no players are present, it's None, if only players of one faction (ignoring juvies and ghosts) are, # it's the faction's name, i.e. 'rowdys' or 'killers', and if both are present, it's 'both' faction_capture = None # how much progress will be made. is higher the more people of one faction are in a district, and is 0 if both teams are present capture_speed = 0 dc_stat_increase_list = [] # checks if any players are in the district and if there are only players of the same faction, i.e. progress can happen for player in all_players: # player[0] is their poi, player[2] their life_state. assigning them to variables might hurt the server's performance if player[0] == district_name and player[ 2] == ewcfg.life_state_enlisted: # if the player is in the district and a gang member faction = player[1] if faction_capture is not None and faction_capture != faction: # if someone of the opposite faction is in the district faction_capture = 'both' # standstill, gang violence has to happen capture_speed = 0 dc_stat_increase_list.clear() elif faction_capture in [ None, faction ]: # if the district isn't already controlled by the player's faction and the capture isn't halted by an enemy faction_capture = faction capture_speed += 1 dc_stat_increase_list.append( player[3]) # player[3] is their id if faction_capture not in [ 'both', None ]: # if only members of one faction is present dist = EwDistrict(id_server=id_server, district=district_name) if dist.capture_points < dist.max_capture_points: for stat_recipient in dc_stat_increase_list: ewstats.change_stat( id_server=id_server, id_user=stat_recipient, metric=ewcfg.stat_capture_points_contributed, n=ewcfg.capture_tick_length * capture_speed) if faction_capture == dist.capturing_faction: # if the faction is already in the process of capturing, continue await dist.change_capture_points( ewcfg.capture_tick_length * capture_speed, faction_capture) elif dist.capture_points == 0 and dist.controlling_faction == "": # if it's neutral, start the capture await dist.change_capture_points( ewcfg.capture_tick_length * capture_speed, faction_capture) dist.capturing_faction = faction_capture # lower the enemy faction's progress to revert it to neutral (or potentially get it onto your side without becoming neutral first) else: # if the (de-)capturing faction is not in control await dist.change_capture_points( -(ewcfg.capture_tick_length * capture_speed * ewcfg.decapture_speed_multiplier), faction_capture) dist.persist() conn.commit() finally: # Clean up the database handles. cursor.close() ewutils.databaseClose(conn_info) return