UltimaForum

Skrypty [XP] - Skrypt - odnawianie HP

artekwnc - Nie 14 Mar, 2010 21:43
Temat postu: Skrypt - odnawianie HP
Mam wam do przedstawienia skrypt - nie mój, z rmxp.pl od Ferredingu

Na czym polega?

Skrypt ten co jakiś czas odnawia 1% SP i HP


Creditsy:
Dla Ferredingu!!!

UWAGI:
Skrypt odmierza tą jednostkę czasu tylko jeśli gracz ma włączoną mapę. Kiedy włączymy menu itp. skrypt nie nalicza klatek.


Skrypt:
Spoiler:

Kod:

#====================================================
#   Recovery On Map
#   by Ferredingu
#   8 kwietnia 2008 r
#   Edytowany
#   Poprawka by Ayene
#====================================================

FRAME = 200 #ilość kratek

class Game_System
  attr_accessor :recovery
  alias recovery_initialize initialize
  def initialize
    @recovery = 1
    recovery_initialize
  end
end

 
class Scene_Map
  alias recovery_update update
  def update
    #==================
    if $game_system.recovery == 1
      if Graphics.frame_count % FRAME == 0
        for i in 0...$game_party.actors.size
          if $game_party.actors[i].hp < $game_party.actors[i].maxhp
            $game_party.actors[i].hp += $game_party.actors[i].maxhp / 100
          end
          if $game_party.actors[i].sp < $game_party.actors[i].maxsp
            $game_party.actors[i].sp += $game_party.actors[i].maxsp / 100
          end
        end
      end
    end
    #==================
    if $game_system.recovery == 2
      if Graphics.frame_count % (FRAME/2) == 0
        for i in 0...$game_party.actors.size
          if $game_party.actors[i].hp < $game_party.actors[i].maxhp
            $game_party.actors[i].hp += $game_party.actors[i].maxhp / 100
          end
          if $game_party.actors[i].sp < $game_party.actors[i].maxsp
            $game_party.actors[i].sp += $game_party.actors[i].maxsp / 100
          end
        end
      end
    end
    #==================
    if $game_system.recovery == 3
      if Graphics.frame_count % (FRAME*2) == 0
        for i in 0...$game_party.actors.size
          if $game_party.actors[i].hp < $game_party.actors[i].maxhp
            $game_party.actors[i].hp += $game_party.actors[i].maxhp / 100
          end
          if $game_party.actors[i].sp < $game_party.actors[i].maxsp
            $game_party.actors[i].sp += $game_party.actors[i].maxsp / 100
          end
        end
      end
    end
    #==================
    recovery_update
  end
end



Instrukcja:
-W linijce 8, wartość którą wpiszemy odpowiada za ilość klatek po której HP i SP ma się odnowić. Liczba klatek podzielona przez 40 daje nam liczbę sekund po której ma się odnowić HP i SP (czyli jeśli jest 200 to 200/40=5 - co pięć sekund HP i SP się odnowi).
-Skrypt ma możliwość wyłączania odnawiania, robi się to poprzez funkcję w zdarzniu "Script..." i wpisując:
$game_system.recovery = 0 - jeśli ma się nie odnawiać
$game_system.recovery = 1 - jeśli ma się odnawiać normalnie
$game_system.recovery = 2 - jeśli ma się odnawiać dwa razy szybciej
$game_system.recovery = 3 - jeśli ma się odnawiać dwa razy wolniej

krychu18 - Sob 27 Mar, 2010 18:39

mi on nie działa.
pw115 - Sob 27 Mar, 2010 19:58

Ponieważ masz nielegalną polską wersję
która jest pełna błędów powstałych podczas tłumaczenia

Flanagan - Nie 28 Mar, 2010 08:44

A można zrobić to tak że np. założe pierścień leczenia i mnie leczy dopiero?????

Jeśli nie to szkoda bo potrzebuje czegoś takiego

Ayene - Nie 28 Mar, 2010 13:20

Skrypt jest błędny, powinien w pętli zwierać po actors[i]. Poprawiłam go nieco i dodałam opcję z przedmiotem leczącym (songoxyz):

Spoiler:

Kod:
#====================================================
#   Recovery On Map
#   by Ferredingu
#   8 kwietnia 2008 r
#   Edytowany
#   Korekta by Ayene
#====================================================

FRAME = 200 #ilość kratek
PRZEDMIOT = [31, 32] # id przedmiotu leczącego

class Game_System
  attr_accessor :recovery
  alias recovery_initialize initialize
  def initialize
    @recovery = 1
    recovery_initialize
  end
end

 
class Scene_Map
  alias recovery_update update
  def update   
    #==================
    if $game_system.recovery == 1
      if Graphics.frame_count % FRAME == 0
        for i in 0...$game_party.actors.size
          if PRZEDMIOT.include?($game_party.actors[i].armor4_id)
            if $game_party.actors[i].hp < $game_party.actors[i].maxhp
              $game_party.actors[i].hp += $game_party.actors[i].maxhp / 100
            end
            if $game_party.actors[i].sp < $game_party.actors[i].maxsp
              $game_party.actors[i].sp += $game_party.actors[i].maxsp / 100
            end
          end
        end
      end
    end
    #==================
    if $game_system.recovery == 2
      if Graphics.frame_count % (FRAME/2) == 0
        for i in 0...$game_party.actors.size
          if PRZEDMIOT.include?($game_party.actors[i].armor4_id)
            if $game_party.actors[i].hp < $game_party.actors[i].maxhp
              $game_party.actors[i].hp += $game_party.actors[i].maxhp / 100
            end
            if $game_party.actors[i].sp < $game_party.actors[i].maxsp
              $game_party.actors[i].sp += $game_party.actors[i].maxsp / 100
            end
          end
        end
      end
    end
    #==================
    if $game_system.recovery == 3
      if Graphics.frame_count % (FRAME*2) == 0
        for i in 0...$game_party.actors.size
          if PRZEDMIOT.include?($game_party.actors[i].armor4_id)
            if $game_party.actors[i].hp < $game_party.actors[i].maxhp
              $game_party.actors[i].hp += $game_party.actors[i].maxhp / 100
            end
            if $game_party.actors[i].sp < $game_party.actors[i].maxsp
              $game_party.actors[i].sp += $game_party.actors[i].maxsp / 100
            end
          end         
        end
      end
    end
    #==================
    recovery_update
  end
end


Bulooo - Pią 25 Cze, 2010 21:41

Ayene możesz mi wytłumaczyć jak zrobić aby ten skrypt dawał mi co krok 1 hp ?
... A najlepiej żeby po wypiciu miksturki mi rosło hp... coś w stylu diablo...

erienus - Sob 26 Cze, 2010 09:44

Ayene a jak zrobić by określony przedmiot leczył przez np 2 minuty.
Ayene - Sob 26 Cze, 2010 10:23

Bulooo, możesz zastosować ten skrypt:
Spoiler:

Kod:
module Ayene
  POTION_ID = 17 # id przedmiotu leczącego
end
 
class Game_Party
  alias ayene_gmparty_inc_steps increase_steps 
  def increase_steps
    ayene_gmparty_inc_steps
    for i in 0...$game_party.actors.size
      if $game_party.actors[i].hp < $game_party.actors[i].maxhp and $game_party.actors[i].states.include?(Ayene::POTION_ID)
        $game_party.actors[i].hp += 1
      end
      if $game_party.actors[i].sp < $game_party.actors[i].maxsp and $game_party.actors[i].states.include?(Ayene::POTION_ID)
        $game_party.actors[i].sp += 1           
      end
    end   
  end
end


Stworzyć nowy status, np. Potion. Wpisać ID tego statusu w skrypcie:
Kod:
POTION_ID = 17

Ustawić przedmiot, który ten status by wywoływał i wszystko powinno działać.

Bulooo - Sob 26 Cze, 2010 10:39

Nowy status ? Czyli.
Niekumam

Mam to tak



Kod:
module Ayene
  POTION_ID = 1 # id przedmiotu leczącego
end
 
class Game_Party
  alias ayene_gmparty_inc_steps increase_steps
  def increase_steps
    ayene_gmparty_inc_steps
    for i in 0...$game_party.actors.size
      if $game_party.actors[i].hp < $game_party.actors[i].maxhp and $game_party.actors[i].states.include?(Ayene::POTION_ID)
        $game_party.actors[i].hp += 1
      end
      if $game_party.actors[i].sp < $game_party.actors[i].maxsp and $game_party.actors[i].states.include?(Ayene::POTION_ID)
        $game_party.actors[i].sp += 1           
      end
    end   
  end
end



I poza wklejeniem tego skryptu coś jeszcze trzeba.
Bo jak nie to mi nie leczy po 1 hp. leczy całość odrazu

Ayene - Sob 26 Cze, 2010 10:43

Źle napisałam, id nie przedmiotu leczącego tylko statusu leczącego. Czyli wejdź w bazę danych, zakładkę States i dodaj 17 (chyba że już jakieś masz) i nazwij do np. Potion albo Regen, jak wolisz. Następnie stwórz przedmiot leczący, ustaw by nie leczył hp tylko wbijał ten nowy status. A w skrypcie ustaw:
Kod:
POTION_ID = 17

Bulooo - Sob 26 Cze, 2010 10:50

Działa :)
A ile będzie trwać ta regeneracja ?
i na przyszłość jak zrobić aby rosło np po 5 hp ?

Ayene - Sob 26 Cze, 2010 10:52

Tak, jak normalny status.
Wystarczy zamienić:
Kod:
$game_party.actors[i].hp += 1

na
Kod:
$game_party.actors[i].hp += 5

Bulooo - Sob 26 Cze, 2010 10:55

Kurcze bo ja mam abs mr mo's i nie wiem czemu mi nie znikają statusy ...
Pisałem już na pomoc

NP. Żeby mi zregenerowało 15 hp i się skończyło

erienus - Sob 26 Cze, 2010 12:40

Skrypt jest zajesuper ^^ dzięki
Bulooo - Sob 26 Cze, 2010 14:26

Dało by się zmienić aby hp dodawało co sekundę a nie tylko jak się chodzi ?
Ayene - Sob 26 Cze, 2010 18:16

Bulooo, no to przecież masz w pierwszym poście leczenie co określoną jednostkę czasu - 200 klatek, wystarczy zmienić tę wartość na mniejszą... pokombinuj trochę.
Bulooo - Sob 26 Cze, 2010 20:08

Nie udało mi się... sorki w skryptach się nie połapię...
Chciał bym Ayene żeby skrypt był ten stary co mi wcześniej dałaś z stanem tylko żeby dawał hp co sec.
Mogła byś mi go przekształcić.

Spróbowałem, dałem id przedmiotu ale nic
Spoiler:

Kod:
#====================================================
#   Recovery On Map
#   by Ferredingu
#   8 kwietnia 2008 r
#   Edytowany
#   Korekta by Ayene
#====================================================

FRAME = 10 #ilość kratek
PRZEDMIOT = [1, 20] # id przedmiotu leczącego

class Game_System
  attr_accessor :recovery
  alias recovery_initialize initialize
  def initialize
    @recovery = 1
    recovery_initialize
  end
end

 
class Scene_Map
  alias recovery_update update
  def update   
    #==================
    if $game_system.recovery == 1
      if Graphics.frame_count % FRAME == 0
        for i in 0...$game_party.actors.size
          if PRZEDMIOT.include?($game_party.actors[i].armor4_id)
            if $game_party.actors[i].hp < $game_party.actors[i].maxhp
              $game_party.actors[i].hp += $game_party.actors[i].maxhp / 100
            end
            if $game_party.actors[i].sp < $game_party.actors[i].maxsp
              $game_party.actors[i].sp += $game_party.actors[i].maxsp / 100
            end
          end
        end
      end
    end
    #==================
    if $game_system.recovery == 2
      if Graphics.frame_count % (FRAME/2) == 0
        for i in 0...$game_party.actors.size
          if PRZEDMIOT.include?($game_party.actors[i].armor4_id)
            if $game_party.actors[i].hp < $game_party.actors[i].maxhp
              $game_party.actors[i].hp += $game_party.actors[i].maxhp / 100
            end
            if $game_party.actors[i].sp < $game_party.actors[i].maxsp
              $game_party.actors[i].sp += $game_party.actors[i].maxsp / 100
            end
          end
        end
      end
    end
    #==================
    if $game_system.recovery == 3
      if Graphics.frame_count % (FRAME*2) == 0
        for i in 0...$game_party.actors.size
          if PRZEDMIOT.include?($game_party.actors[i].armor4_id)
            if $game_party.actors[i].hp < $game_party.actors[i].maxhp
              $game_party.actors[i].hp += $game_party.actors[i].maxhp / 100
            end
            if $game_party.actors[i].sp < $game_party.actors[i].maxsp
              $game_party.actors[i].sp += $game_party.actors[i].maxsp / 100
            end
          end         
        end
      end
    end
    #==================
    recovery_update
  end
end


Ayene - Sob 26 Cze, 2010 20:22

Spróbuj to:
Spoiler:

Kod:
module Ayene
  POTION_ID = 16 # id statusu leczącego
  FRAME = 30 #ilość kratek
end
 
class Scene_Map
  alias recovery_update update
  def update   
    if Graphics.frame_count % Ayene::FRAME == 0
      for i in 0...$game_party.actors.size       
        if $game_party.actors[i].hp < $game_party.actors[i].maxhp and $game_party.actors[i].states.include?(Ayene::POTION_ID)
          $game_party.actors[i].hp += 1
        end
        if $game_party.actors[i].sp < $game_party.actors[i].maxsp and $game_party.actors[i].states.include?(Ayene::POTION_ID)
          $game_party.actors[i].sp += 1
        end
      end
    end
    recovery_update
  end
end


Bulooo - Sob 26 Cze, 2010 21:05

Wkleiłem raz ten skrypt tak aby mi dawał 1 hp. I działa
Ale 1 raz nie wystarczy więc wkleiłem więcej razy aby można było zrobić mikstury z różnymi ilościami hp.
Wygląda to tak


Ale wyskakuję mi taki błąd.




Dało by się go naprawić ?

Ayene - Nie 27 Cze, 2010 09:27

Nie powinno się powielać tych samych skryptów, grozi to właśnie takim błędem.
Spróbuj ten skrypt:
Spoiler:

Kod:
module Ayene
  FRAME = 30 #ilość kratek 
  REGEN_ID = { # id statusu leczącego => ilość leczonego HP i SP
  16 => 1,
  17 => 5,
  18 => 15,
  }
end
 
class Scene_Map
  alias recovery_update update
  def update   
    if Graphics.frame_count % Ayene::FRAME == 0
      for i in 0...$game_party.actors.size   
      for a in 0...$game_party.actors[i].states.size
        if $game_party.actors[i].hp < $game_party.actors[i].maxhp and Ayene::REGEN_ID.include?($game_party.actors[i].states[a])
          $game_party.actors[i].hp += Ayene::REGEN_ID[$game_party.actors[i].states[a]]
        end
        if $game_party.actors[i].sp < $game_party.actors[i].maxsp and Ayene::REGEN_ID.include?($game_party.actors[i].states[a])
          $game_party.actors[i].sp += Ayene::REGEN_ID[$game_party.actors[i].states[a]]
        end
      end
      end
    end
    recovery_update
  end
end


Wystarczy, że stworzysz kilka osobnych statusów i każdemu id w skrypcie przyporządkujesz inną wartość leczonego hp. Dokładnie w tym fragmencie:
Kod:
  REGEN_ID = { # id statusu leczącego => ilość leczonego HP i SP
  16 => 1,
  17 => 5,
  18 => 15,
  }

Bulooo - Nie 27 Cze, 2010 09:30

A dało by się zrobić aby osobno regenerowało hp i osobno sp ?
bo teraz regeneruje hp i sp razem, a chciał bym osobno

Ayene - Nie 27 Cze, 2010 09:36

A nie mogłeś od razu tego napisać. Zobacz, ile razy musiałam już ten skrypt modyfikować!
Spoiler:

Kod:
module Ayene
  FRAME = 30 #ilość kratek 
  REGEN_ID = { # id statusu leczącego => ilość leczonego [HP, SP]
  16 => [1, 1],
  17 => [5, 1] ,
  18 => [15, 5],
  }
end
 
class Scene_Map
  alias recovery_update update
  def update   
    if Graphics.frame_count % Ayene::FRAME == 0
      for i in 0...$game_party.actors.size   
      for a in 0...$game_party.actors[i].states.size
        if $game_party.actors[i].hp < $game_party.actors[i].maxhp and Ayene::REGEN_ID.include?($game_party.actors[i].states[a])
          $game_party.actors[i].hp += Ayene::REGEN_ID[$game_party.actors[i].states[a]][0]
        end
        if $game_party.actors[i].sp < $game_party.actors[i].maxsp and Ayene::REGEN_ID.include?($game_party.actors[i].states[a])
          $game_party.actors[i].sp += Ayene::REGEN_ID[$game_party.actors[i].states[a]][1]
        end
      end
      end
    end
    recovery_update
  end
end


Bulooo - Nie 27 Cze, 2010 09:40

Dzięki Ayene i przepraszam
Marvel1795 - Czw 20 Sty, 2011 15:05

A czy istnieje ten skrypt na VX?
Jeżeli on jest, to bardzo bym prosił o zamieszczenie linka.

Shlizer - Czw 20 Sty, 2011 15:09

Hmm.. spróbuj zamienić wszystkie 'actors' na 'members'.. może zadziała.
genialnyzolw - Sro 04 Maj, 2011 15:13

hmm
a da się zrobić tak że jakiś bohater jak ma 0 hp (umiera) to się nie leczy ?

Ayene - Sro 04 Maj, 2011 17:00

Znajdź trzy razy linijkę:
Kod:
for i in 0...$game_party.actors.size

i pod nią dodaj:
Kod:
return if $game_party.actors[i].dead?

genialnyzolw - Sro 04 Maj, 2011 20:50

Ok dzięki już działa jak należy

Powered by phpBB modified by Przemo © 2003 phpBB Group