Suporte ao desenvolvimento de jogos!


    [DÚVIDA NPCrystal] Sistema de rank PVP com imagem global

    Compartilhe
    avatar
    Inato
    Iniciante
    Iniciante

    Mensagens : 61
    Créditos : 6

    Ficha do personagem
    Nível: 1
    Vida:
    30/30  (30/30)
    Energia:
    0/0  (0/0)

    [DÚVIDA NPCrystal] Sistema de rank PVP com imagem global

    Mensagem por Inato em Seg Maio 07, 2018 2:58 pm

    Existe algo (ou que dê pra fazer) no NPCrystal que, ao um player morrer pelas mãos de outro player (no pvp por assim dizer), conte alguma variável?

    Ou seja, se eu matei outro player, aumenta uma variável, se eu morrer, diminui uma variável. (eu sei que isso dá pra fazer com monstros, que usamos até para quests de matar mob, mas por player? Dá?)

    O intuito é fazer um sistema de rank diferente dos de level que já tem no netplay, um que, ao contar uma certa quantidade de mortes, e consequentemente uma certa quantidade de pontos em variável, mostre uma imagem na tela uma espécie de emblema/brasão, algo que normalmente a gente ver no League of Legends, Clash Of Clans/Royale e similares.

    Se existe já isso, alguém pode me dizer onde fica? E se não existe, dar uma idéia de como fazer? (pode ser pelos eventos simples/comuns mesmo).

    Angel

    [Edit: O que seria mais overpower era que esse emblema mostrasse em cima do nome do personagem, onde os outros players também conseguissem ver (como o que acontece com a guild)]

    [Edit 2: Editei o título devido as novas regras postadas pelo Paulo Soreto]


    Última edição por Inato em Ter Maio 08, 2018 3:03 pm, editado 3 vez(es)
    avatar
    Valentine
    Administrador
    Administrador

    Medalhas :
    Mensagens : 4864
    Créditos : 1041

    Re: [DÚVIDA NPCrystal] Sistema de rank PVP com imagem global

    Mensagem por Valentine em Seg Maio 07, 2018 3:19 pm

    Tem algum script chamado pvp? Se tiver, posso ver alguma forma de fazer.


    _________________
    avatar
    Inato
    Iniciante
    Iniciante

    Mensagens : 61
    Créditos : 6

    Ficha do personagem
    Nível: 1
    Vida:
    30/30  (30/30)
    Energia:
    0/0  (0/0)

    Re: [DÚVIDA NPCrystal] Sistema de rank PVP com imagem global

    Mensagem por Inato em Seg Maio 07, 2018 3:27 pm

    @Valentine escreveu:Tem algum script chamado pvp? Se tiver, posso ver alguma forma de fazer.

    O que tem de parecido com PVP é esse com nome de [ABS] PlayerVsPlayer*. 

    Link https://pastebin.com/mwXpyB9u ou código abaixo:
    Código:
    #============================================================================
    # *  Mr.Mo's ABS
    #============================================================================
    # Mr.Mo "Muhammet Sivri"
    # Version 1
    # 09.16.06
    #============================================================================
    #--------------------------------------------------------------------------
    # * Begin SDK Enable Test
    #--------------------------------------------------------------------------
    if SDK.state("Mr.Mo's ABS") == true
      VICTORY = '002-Victory02' #THis is the ME that will be played when a player wins.
                                #You can change it if you want.
                                
      EXP_GAIN = 2              #How much EXP should the winner gain? IT works like this
                                #level * EXP_GAIN
                                #level = the loser's level
                                
      GOLD_GAIN = 0.2          #Get the looser's gold. The number is by percents.
                                #Gained_Gold = looser.gold*.10
                                #0 Would be nothing.
    class MrMo_ABS
      #--------------------------------------------------------------------------
      # * Player Melee Attack
      #--------------------------------------------------------------------------
      def player_melee
        return $chat.texto("Equipe alguma arma para atacar") if $data_weapons[@actor.weapon_id] == nil
        return if attacked_monster?
        return if attacked_player?
      end
      #--------------------------------------------------------------------------
      # * Player Attacked a Monster?
      #--------------------------------------------------------------------------
      def attacked_monster?
        #Get all enemies
        for e in @enemies.values
          #Skip NIL values or dead enemies
          next if e == nil or e.dead?
          #Skip the enemy if its not close by or not facing
          next if !in_direction?($game_player, e.event) or !in_range?($game_player, e.event, 1)
          #Attack the enemy
          e.attack_effect(@actor)
          #Get Animation
          a = $data_weapons[@actor.weapon_id].animation2_id
          #Hit enemy if the attack succeeds
          hit_enemy(e, @actor, a) if e.damage != "Miss" and e.damage != 0
          #Animate the player
          if MELEE_ANIMATION[@actor.weapon_id] == nil
            animate($game_player, $game_player.character_name+"_melee") if @player_ani
          else
            m = MELEE_ANIMATION[@actor.weapon_id]
            animate($game_player, $game_player.character_name+m.to_s) if @player_ani
          end
          #Return if the enemy is dead
          return true if enemy_dead?(e,@actor)
          return true if !e.hate_group.include?(0)
          #Set the new target for the enemy
          e.attacking = $game_player
          #The enemy is now in battle
          e.in_battle = true
          #Setup movement
          setup_movement(e)
        end
        return false
      end
      #--------------------------------------------------------------------------
      # * Player Attacked a Player?
      #--------------------------------------------------------------------------
      def attacked_player?
        #Get all enemies
        for pl in Network::Main.mapplayers.values
          #Skip NIL values or dead enemies
          next if pl == nil or pl.hp == 0 or pl.map_id != $game_map.map_id
          #Skip the enemy if its not close by or not facing
          next if !in_direction?($game_player, pl) or !in_range?($game_player, pl, 1)
          next if pl.hp <= 0
          unless User_Edit::PVPMAPS.include?($game_map.map_id)
            $chat.texto("Você não pode atacar jogadores aqui!")
            return
          end
          #Attack the player
          damage = pl.attack_effect
          #Get Animation
          a = $data_weapons[@actor.weapon_id].animation2_id
          #Store the player's net id
          netid = pl.netid
          #Send the demage and aniamtion
          Network::Main.socket.send("<attack_id>#{netid}\n") if damage != "Miss" and damage != 0
          Network::Main.socket.send("<attack_effect>dam=#{damage}; ani=#{a} id=#{Network::Main.id}</attack_effect>\n") if damage != "Miss" and damage != 0
          pl.show_demage(damage,false) if damage != "Miss" and damage != 0
          #Hit enemy if the attack succeeds
          hit_enemy(pl, @actor, a) if damage != "Miss" and damage != 0
          #Animate the player
          if MELEE_ANIMATION[@actor.weapon_id] == nil
            animate($game_player, $game_player.character_name+"_melee") if @player_ani
          else
            m = MELEE_ANIMATION[@actor.weapon_id]
            animate($game_player, $game_player.character_name+m.to_s) if @player_ani
          end
          netplayer_killed(pl) if pl.hp <= 0
          return true
        end
        return false
      end
      #--------------------------------------------------------------------------
      # * Player Skill Attack
      #--------------------------------------------------------------------------
      def player_skill(id)
        #Get Skill
        skill = $data_skills[id]
        @actor = $game_party.actors[0] unless @actor
        #Return if the skill doesn't exist
        return if skill == nil
        #Return if the actor doesn't have the skill
        return if !@actor.skills.include?(skill.id)
        #Return if the actor can't use the skill
        return if !@actor.can_use_skill?(skill)
        #Animate
        if SKILL_ANIMATION.has_key?(id)
          l = SKILL_ANIMATION[id]
          animate($game_player, $game_player.character_name+l.to_s) if @player_ani
        else
          animate($game_player, $game_player.character_name+"_cast") if @player_ani
        end
        #Get the skill scope
        case skill.scope
        when 1 #Enemy
          #If the skill is ranged
          if RANGE_SKILLS.has_key?(skill.id)
            #Add to range
            @range.push(Game_Ranged_Skill.new($game_player, @actor, skill))
            range = RANGE_SKILLS[skill.id]
            Network::Main.socket.send("<10>self.range_sprite(#{$game_map.map_id},[#{$game_player.direction},#{$game_player.x},#{$game_player.y}],$game_party.actors[0],#{@actor.weapon_id},'#{range[2]}',#{range[1]},#{range[0]},#{Network::Main.id}, #{skill.id})</10>\n")
            #Take off SP
            @actor.sp -= skill.sp_cost
            return
          end
          #If the skill is not ranged
          enemies = []
          #Get all enemies
          for enemy in @enemies.values
            next if enemy == nil
            enemies.push(enemy)
          end
          #Get all players
          for player in Network::Main.mapplayers.values
            next if player == nil
            enemies.push(player)
          end
          #Order them from closest to the farthest
          enemies.sort! {|a,b|
          get_range(a.event,b.event) - get_range(b.event,a.event) }
          return if enemies[0] == nil
          #Attack the closest one
          enemies[0].effect_skill(@actor, skill)
          if enemies[0].is_a?(Game_NetPlayer)
            unless User_Edit::PVPMAPS.include?($game_map.map_id)
             $chat.texto("Você não pode atacar jogadores aqui!")
             return
            end
            damage = enemies[0].damage
            pl = enemies[0]
            a = skill.animation2_id
            #Store the player's net id
            netid = pl.netid
            #Send the demage and aniamtion
            Network::Main.socket.send("<attack_id>#{netid}\n") if damage != "Miss" and damage != 0
            Network::Main.socket.send("<attack_effect>dam=#{damage}; ani=#{a} id=#{Network::Main.id}</attack_effect>\n") if damage != "Miss" and damage != 0
            pl.show_demage(damage,false) if damage != "Miss" and damage != 0
          end
          #Take off SP
          @actor.sp -= skill.sp_cost
          #Show Animetion on enemy
          hit_enemy(enemies[0], @actor, skill.animation2_id) if enemies[0].damage != "Miss" and enemies[0].damage != 0
          #Return if enemy is dead
          return if enemy_dead?(enemies[0],@actor)
          return if !enemy.hate_group.include?(0)
          #If its alive, put it in battle
          enemies[0].in_battle = true
          #Make it attack the player
          enemies[0].attacking = $game_player
          #Setup movement
          setup_movement(enemies[0])
          return
        when 2 #All Emenies
          #Play the animation on player
          $game_player.animation_id = skill.animation2_id
          #Take off SP
          @actor.sp -= skill.sp_cost
          enemies = get_all_range
          #Get all enemies
          for e in enemies.values
            #Skip NIL values
            next if e == nil
            #Attack enemy
            e.effect_skill(@actor, skill)
            #Show Animetion on enemy
            hit_enemy(e, @actor, 0) if enemy.damage != "Miss" and enemy.damage != 0
            #Skip this enemy if its dead
            next if enemy_dead?(e,@actor)
            next if !e.hate_group.include?(0)
            #If its alive, put it in battle
            enemy.in_battle = true
            #Make it attack the player
            enemy.attacking = $game_player
            #Setup movement
            setup_movement(e)
          end
          return
        when 3..4, 7 #User
          unless $Manager["Top_Hud"].netplayer.nil?
            netid = $Manager["Top_Hud"].netid
            Network::Main.socket.send("<10> net_skill(#{id}, '#{netid}', '#{$game_party.actors[0].name}') </10> \n")
            return
          end
          #Use the skill on the player
          @actor.effect_skill(@actor, skill)
          #Take off SP
          @actor.sp -= skill.sp_cost
          #Play animation
          $game_player.animation_id = skill.animation2_id
          return
        end
      end
      #--------------------------------------------------------------------------
      # * Get ALL Range(Element, Range)
      #--------------------------------------------------------------------------
      def get_all_range(element, range)
        objects = []
        for e in @enemies.values
          next if e == nil
          objects.push(e) if in_range?(element, e.event, range)
        end
        for player in Network::Main.mapplayers.values
          next if player == nil
          objects.push(player) if in_range?(element, player, range)
        end
        return objects
      end
      #--------------------------------------------------------------------------
      # * Netplayer Killed
      #--------------------------------------------------------------------------
      def netplayer_killed(player)
        #Audio.me_play("Audio/ME/" + VICTORY, 80, 100)
        actor = $game_party.actors[0]
        if actor.cant_get_exp? == false
          last_level = actor.level
          exp = player.level * EXP_GAIN
          actor.exp += player.level * EXP_GAIN
          if actor.level > last_level
            $game_player.show_demage("Level Up!",false)
            actor.hp = actor.maxhp
            actor.sp = actor.maxsp
          end
        end
        $chat.texto("Voce matou"+player.name)
        return if GOLD_GAIN <= 0
        return if player.gold <= 0
        gold = player.gold*GOLD_GAIN
        $game_party.gain_gold(gold.to_i)
      end
    end

    #============================================================================
    # * Game Ranged Skill
    #============================================================================
    class Game_Ranged_Skill < Range_Base
      attr_reader    :skill
      attr_accessor  :stop
      def update
        super
        for range in $ABS.range
         next if range == self
         skill = range.skill
         next if skill.nil?
         if is_number?(skill)
           skill = $data_skills[skill]
         end
         if range.x == @x and range.y == @y
           if @skill.power > skill.power
             range.stop = true
           elsif @skill.power < skill.power
             @stop = true
           elsif @skill.power == skill.power
             @stop = true
             range.stop = true
           end
          @animation_id = 102
         end
       end
     end
      #--------------------------------------------------------------------------
      # * Check Event Trigger Touch(x,y)
      #--------------------------------------------------------------------------
      def check_event_trigger_touch(x, y)
        return if @stop
        hit_player if x == $game_player.x and y == $game_player.y
        for event in $game_map.events.values
          if event.x == x and event.y == y
            if event.character_name == ""
              froce_movement
            else
              hit_event(event.id)
            end
          end
        end
        return if @parent.is_a?(Game_Event)
        #Check netplayer hit
        for player in Network::Main.mapplayers.values
          next if player == nil
          next if player.x != x or player.y != y
          hit_netplayer(player)
        end
      end
      #--------------------------------------------------------------------------
      # * Hit NetPlayer
      #--------------------------------------------------------------------------
      def hit_netplayer(player)
        unless User_Edit::PVPMAPS.include?($game_map.map_id)
          $chat.texto("Você não pode atacar jogadores aqui!")
          return
        end
        @stop = true
        #Get Actor
        actor = player
        #Get Enemy
        enemy = @actor
        #Attack Actor
        damage = actor.effect_skill(enemy, @skill)
        damage = player.damage
        #Store the player's net id
        netid = player.netid
        a = @skill.animation2_id
        player.jump(0,0) if damage != "Miss" and damage != 0
        #Send the demage and aniamtion
        Network::Main.socket.send("<attack_id>#{netid}\n") if damage != "Miss" and damage != 0
        Network::Main.socket.send("<attack_effect>dam=#{damage}; ani=#{a} id=#{Network::Main.id}</attack_effect>\n") if damage != "Miss" and damage != 0
        #Show animation on player
        player.animation_id = @skill.animation2_id if actor.damage != "Miss" and actor.damage != 0
        #Check if enemy is dead
        player.show_demage(player.damage,false) if damage != "Miss" and damage != 0
        $ABS.netplayer_killed(player) if player.hp <= 0
      end  
    end
    #============================================================================
    # * Game Ranged Weapons
    #============================================================================
    class Game_Ranged_Weapon < Range_Base
      #--------------------------------------------------------------------------
      # * Check Event Trigger Touch(x,y)
      #--------------------------------------------------------------------------
      def check_event_trigger_touch(x, y)
        return if @stop
        hit_player if x == $game_player.x and y == $game_player.y
        for event in $game_map.events.values
          next if event.x != x or event.y != y
          if event.character_name == ""
            froce_movement
          else
            hit_event(event.id)
          end
        end
        return if @parent.is_a?(Game_Event)
        #Check netplayer hit
        for player in Network::Main.mapplayers.values
          next if player == nil
          next if player.x != x or player.y != y
          hit_netplayer(player)
        end
      end
      #--------------------------------------------------------------------------
      # * Hit NetPlayer
      #--------------------------------------------------------------------------
      def hit_netplayer(player)
        unless User_Edit::PVPMAPS.include?($game_map.map_id)
          $chat.texto("Você não pode atacar jogadores aqui!")
          return
        end
        @stop = true
        #Get Enemy
        enemy = @actor
        #Attack Actor
        damage = player.attack_effect(enemy)
        #Store the player's net id
        netid = player.netid
        a = @range_wepaon[2]
        player.jump(0,0) if damage != "Miss" and damage != 0
        #Send the demage and aniamtion
        Network::Main.socket.send("<attack_id>#{netid}\n") if damage != "Miss" and damage != 0
        Network::Main.socket.send("<attack_effect>dam=#{damage}; ani=#{a} id=#{Network::Main.id}</attack_effect>\n") if damage != "Miss" and damage != 0
        #Show animation on player
        player.animation_id = @range_wepaon[2] if player.damage != "Miss" and player.damage != 0
        #Check if enemy is dead
        player.show_demage(player.damage,false) if damage != "Miss" and damage != 0
        $ABS.netplayer_killed(player) if player.hp <= 0
      end  
    end
    #--------------------------------------------------------------------------
    # * SDK End
    #--------------------------------------------------------------------------
    end


    def net_skill(id, netid, player)
      @actor = $game_party.actors[0]
      if Network::Main.id == netid
        $chat.texto(player + " usou #{$data_skills[id].name} em você")
        @actor.effect_skill(@actor, $data_skills[id])
        @actor.sp -= $data_skills[id].sp_cost
        $game_player.animation_id = $data_skills[id].animation2_id
      end
    end
    avatar
    oraki
    Novato
    Novato

    Mensagens : 23
    Créditos : 4

    Re: [DÚVIDA NPCrystal] Sistema de rank PVP com imagem global

    Mensagem por oraki em Ter Maio 08, 2018 4:52 pm

    Sim, dá. Neste mesmo código que você disponibilizou dê CTRL + F e procure por:

    Código:
    $chat.texto("Voce matou"+player.name)
        return if GOLD_GAIN <= 0
        return if player.gold <= 0
        gold = player.gold*GOLD_GAIN
        $game_party.gain_gold(gold.to_i)

    Por quê? Simples, nesta parte é enviado a mensagem ao matar o player, e claro, o ouro. Creio eu que você pode adicionar += 1 da game variable por lá também, assim sendo, sempre que matar alguém, aumenta em 1 da game_variable que você criou a condição.

    Eu te mandaria o código certinho para adicionar, mas tô sem o NPC para fazer o teste. Se não conseguir, me manda PM dps.


    _________________
    avatar
    Inato
    Iniciante
    Iniciante

    Mensagens : 61
    Créditos : 6

    Ficha do personagem
    Nível: 1
    Vida:
    30/30  (30/30)
    Energia:
    0/0  (0/0)

    Re: [DÚVIDA NPCrystal] Sistema de rank PVP com imagem global

    Mensagem por Inato em Ter Maio 08, 2018 6:15 pm

    @oraki escreveu:Sim, dá. Neste mesmo código que você disponibilizou dê CTRL + F e procure por:

    Código:
    $chat.texto("Voce matou"+player.name)
        return if GOLD_GAIN <= 0
        return if player.gold <= 0
        gold = player.gold*GOLD_GAIN
        $game_party.gain_gold(gold.to_i)

    Por quê? Simples, nesta parte é enviado a mensagem ao matar o player, e claro, o ouro. Creio eu que você pode adicionar += 1 da game variable por lá também, assim sendo, sempre que matar alguém, aumenta em 1 da game_variable que você criou a condição.

    Eu te mandaria o código certinho para adicionar, mas tô sem o NPC para fazer o teste. Se não conseguir, me manda PM dps.

    Entendi, mas aí, se eu adicionar a game_variable aí, as quests de matar monstros que usam essa variavel também vai ser afetada né não? (pois eles usam isso) O meu intuito é contar outra variável, e consequentemente mostrar uma imagem em cima da cabeça do NPC quando uma quantidade de variável ser atingida (ou perdida)... 
    avatar
    oraki
    Novato
    Novato

    Mensagens : 23
    Créditos : 4

    Re: [DÚVIDA NPCrystal] Sistema de rank PVP com imagem global

    Mensagem por oraki em Ter Maio 08, 2018 7:36 pm

    Então, é só usar uma variável diferente da que você usa em outras partes do jogo.

    Contanto que não seja global. Já em relação á essa imagem, é mais fácil criar por evento comum em processo paralelo. Ou pelo próprio código, enfim, depende da sua criatividade.


    _________________
    avatar
    Inato
    Iniciante
    Iniciante

    Mensagens : 61
    Créditos : 6

    Ficha do personagem
    Nível: 1
    Vida:
    30/30  (30/30)
    Energia:
    0/0  (0/0)

    Re: [DÚVIDA NPCrystal] Sistema de rank PVP com imagem global

    Mensagem por Inato em Ter Maio 08, 2018 10:38 pm

    @oraki escreveu:Então, é só usar uma variável diferente da que você usa em outras partes do jogo.

    Contanto que não seja global. Já em relação á essa imagem, é mais fácil criar por evento comum em processo paralelo. Ou pelo próprio código, enfim, depende da sua criatividade.

    Vish, meu intuito era ser global, do mesmo jeito que a bandeira da guild é global... Bem, irei ver como faço nesse seu exemplo aí, ver se consigo acertar pelos eventos (e script), de qualquer forma obrigado por ter disponibilizado para ajudar   Indignity


    Enquanto isso, vou aguardando o Valentine também, ele disse que iria ver algo pelo script, como sei que ele é muito ocupado nem irei apressar ele  Successful

    Conteúdo patrocinado

    Re: [DÚVIDA NPCrystal] Sistema de rank PVP com imagem global

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Sex Maio 25, 2018 7:00 pm