Eu nunca respondi ninguém dizendo "aprenda a programar". Quando alguém pede um sistema, ou eu digo que farei futuramente, se tiver na minha lista, ou que não pretendo fazer, ou que é muito específico para um jogo (maioria dos pedidos). E mesmo que eu tivesse dito para alguém aprender a programar, não haveria nenhum problema, já que quem quer fazer um bom jogo tem que saber um pouco de tudo, inclusive no próprio Manual há um link de aulas de programação.Otávio Grunje escreveu:Valentine escreveu:Você pode tentar usar isso:takub088 escreveu:Valentine escreveu:Script Vocab.takub088 escreveu:
Como posso editar o canal de bate-papo em tailandês? Obrigada
#textbox
Não consigo digitar tailandês na caixa de texto.
Só consigo digitar em inglês.
UTF-8
https://docs.microsoft.com/en-us/windows/win32/intl/input-method-manager
Valentine, você está sugerindo para pessoas as (que provavelmente nunca programaram na vida) que elas implementem uma API no seu sistema?
Eu não me surpreendo, pois não é a primeira vez que vejo você respondendo dúvidas ou pedidos com "aprenda a programar".
+142
steven459
offzinho
xurana321
CaJú
riegel
Kernel
raycostabrito
MokirShabat
Ioriyagami190
kamus9629
Acalantus
bazante
emii41so
jonatas_cg
StormAD
-JohnLennon-
LeonM²
psousa
ElKhadafo
Gumg
Snoopy
marcoabruneriZ
faeltwister
ahiraa
Sonart
Naziozeno
Blue
guideath
CaioAnselmo
Biehnandikki
shoves123
ramoncs13
darkfoligno
rushmima
kike669165
Nextt
Tankevil
KauaiÉMeuNomeDeVerdade
diohellfire
AllyssonRpg
Otávio Grunje
onigoetia
takub088
Geynecmi
EduKrowlley
Gabas
Minos
godzilamaker
folignooo
SunsetHill
Allan443211
Pingo de Leite
ezzcardoso
aeFly
Maximus0037
Lixølas
sufaiterevo
wesleykk
tknooz
Adanrox
4l3ff
IsraTwerknov
DragonicK
zgrise
RD12
GuLabonia
saask
iGhoul
OFWGKTA
StellaS2
Brayan96
yuri.dante
PlayDev
eek
TheJhow
Rayner
Aldimun
Shiy
Edsephiroth
Valentine
Mazxz123
iCoke~
Caio Juan
Zetto
Daniel Carvalho
lupptyr
babugue
koezyrs
Makisso
Crunchbird
eluedes
Pain Correndo
renatokamus
Aither
makergame2000
PoxaFiih
afcbb123
GVS3281
Kenshiro
Flares
Satheios
dpsdenes
Pain
Ps+
kinhoccs
Lief
-Luther
Haseo
Kincy
Dexter
admbaiakme
Paulo Soreto
GallighanMaker
luutr
Azel
Honinbou
sklokize
HarturPl4ys
Trpino
Kuroshi
sam-rtp-rgss
Ruan
wclear
driko
Dreew00
LightOfNyx
jiraya
Takkun
iJackboy
Profane ~
moon.sarito1
Soubi92
DevWithCoffee
snaker15
Fabrizio
whitespirits
Conjurador
Readerusama
Komuro Takashi
Kies
Manticora
Dooolly
146 participantes
VXA-OS - Crie seu MMO com RPG Maker
- Mensagem nº521
Re: VXA-OS - Crie seu MMO com RPG Maker
Paulo Soreto- Lenda
- Mensagens : 1980
Créditos : 367
Ficha do personagem
Nível: 1
Experiência:
(0/0)
Vida:
(30/30)
- Mensagem nº523
Re: VXA-OS - Crie seu MMO com RPG Maker
Otávio Grunje escreveu:Valentine escreveu:Você pode tentar usar isso:takub088 escreveu:Valentine escreveu:Script Vocab.takub088 escreveu:
Como posso editar o canal de bate-papo em tailandês? Obrigada
#textbox
Não consigo digitar tailandês na caixa de texto.
Só consigo digitar em inglês.
UTF-8
https://docs.microsoft.com/en-us/windows/win32/intl/input-method-manager
Valentine, você está sugerindo para pessoas as (que provavelmente nunca programaram na vida) que elas implementem uma API no seu sistema?
Eu não me surpreendo, pois não é a primeira vez que vejo você respondendo dúvidas ou pedidos com "aprenda a programar".
O VXA-OS é um projeto open source. Até pouco tempo atrás tínhamos problemas com o RPG Maker para trazer alguns caracteres da língua portuguesa pro jogo, já que o próprio RPG Maker NÃO TEM SUPORTE AO INPUT de nada exceto os controles padrões. Depois de muitas versões (Netplay Plus, Netplay Master, Netmaker...) chegamos ao ponto que estamos hoje. Eu preciso lembrar vocês que apesar do projeto ser de código aberto, somente o @Valentine está prestando manutenção, já que a comunidade não oferece conteúdo adicional (diferente da época do Netplay Master que Netplay Crystal, nostálgico).
Agora você pensa, é mesmo culpa dele não ter suporte a tailandês ou chinês ou qualquer outro idioma que traga caracteres desconhecidos para o jogo? Sério? Já levou muito tempo pra termos suporte a nossa própria língua, imagina uma que nunca tivemos contato.
Essas coisas não são tão simples de se fazer, e bem, o máximo que eu posso fazer é indicar a vocês que desejam suporte a línguas com sistema de escrita simbólico é procurar o @Dragonick e a engine dele, que certamente suporta esse tipo de coisa.
Última edição por Paulo Soreto em Sáb Mar 28, 2020 8:27 pm, editado 1 vez(es)
Kies- Diva
- Mensagens : 1155
Créditos : 124
Ficha do personagem
Nível: 1
Experiência:
(0/0)
Vida:
(30/30)
- Mensagem nº525
Re: VXA-OS - Crie seu MMO com RPG Maker
Valentine escreveu:Eu nunca respondi ninguém dizendo "aprenda a programar". Quando alguém pede um sistema, ou eu digo que farei futuramente, se tiver na minha lista, ou que não pretendo fazer, ou que é muito específico para um jogo (maioria dos pedidos). E mesmo que eu tivesse dito para alguém aprender a programar, não haveria nenhum problema, já que quem quer fazer um bom jogo tem que saber um pouco de tudo, inclusive no próprio Manual há um link de aulas de programação.Otávio Grunje escreveu:Valentine escreveu:Você pode tentar usar isso:takub088 escreveu:Valentine escreveu:Script Vocab.takub088 escreveu:
Como posso editar o canal de bate-papo em tailandês? Obrigada
#textbox
Não consigo digitar tailandês na caixa de texto.
Só consigo digitar em inglês.
UTF-8
https://docs.microsoft.com/en-us/windows/win32/intl/input-method-manager
Valentine, você está sugerindo para pessoas as (que provavelmente nunca programaram na vida) que elas implementem uma API no seu sistema?
Eu não me surpreendo, pois não é a primeira vez que vejo você respondendo dúvidas ou pedidos com "aprenda a programar".
Ele como criador do projeto VXAOS pode falar oque quiser JÁ QUE! O PROJETO É 100% GRATUITO! E ELE NÃO GANHOU NADA PRA FAZER OQUE JA FEZ; ESTÁ ACHANDO RUIM? ESTUDA PROGRAMAÇAO!!!!!! E FAZ SUA ENGINE PORÉM POSTA PRA TODOS USAREM SEM GANHAR 1 REAL!
tknooz- Novato
- Mensagens : 16
Créditos : 0
- Mensagem nº526
Re: VXA-OS - Crie seu MMO com RPG Maker
- Código:
#==============================================================================
# ** Handle_Data
#------------------------------------------------------------------------------
# Este script recebe as mensagens do cliente.
#------------------------------------------------------------------------------
# Autor: Valentine
#==============================================================================
module Handle_Data
def handle_messages(client, buffer)
begin
header = buffer.read_byte
if client.in_game?
handle_messages_game(client, header, buffer)
else
handle_messages_menu(client, header, buffer)
end
rescue => e
client.close_connection
@log.add('Error', :red, "Erro: #{e}\n#{e.backtrace.join("\n")}")
end
end
def handle_messages_menu(client, header, buffer)
case header
when Constants::PACKET_LOGIN
handle_login(client, buffer)
when Constants::PACKET_NEW_ACCOUNT
handle_new_account(client, buffer)
when Constants::PACKET_NEW_CHAR
handle_new_character(client, buffer)
when Constants::PACKET_REMOVE_CHAR
handle_remove_character(client, buffer)
when Constants::PACKET_USE_CHAR
handle_use_character(client, buffer)
end
end
def handle_messages_game(client, header, buffer)
case header
when Constants::PACKET_PLAYER_MOVE
handle_player_movement(client, buffer)
when Constants::PACKET_CHAT_MSG
handle_chat_message(client, buffer)
when Constants::PACKET_PLAYER_ATTACK
handle_player_attack(client)
when Constants::PACKET_USE_ITEM
handle_use_item(client, buffer)
when Constants::PACKET_USE_SKILL
handle_use_skill(client, buffer)
when Constants::PACKET_CHANGE_HOTBAR
handle_change_hotbar(client, buffer)
when Constants::PACKET_USE_HOTBAR
handle_use_hotbar(client, buffer)
when Constants::PACKET_TARGET
handle_target(client, buffer)
when Constants::PACKET_ADD_DROP
handle_add_drop(client, buffer)
when Constants::PACKET_REMOVE_DROP
handle_remove_drop(client, buffer)
when Constants::PACKET_PLAYER_PARAM
handle_player_param(client, buffer)
when Constants::PACKET_PLAYER_EQUIP
handle_player_equip(client, buffer)
when Constants::PACKET_OPEN_FRIENDS
handle_open_friends(client)
when Constants::PACKET_REMOVE_FRIEND
handle_remove_friend(client, buffer)
when Constants::PACKET_NEW_GUILD
handle_new_guild(client, buffer)
when Constants::PACKET_OPEN_GUILD
handle_open_guild(client)
when Constants::PACKET_GUILD_LEADER
handle_guild_leader(client, buffer)
when Constants::PACKET_GUILD_NOTICE
handle_guild_notice(client, buffer)
when Constants::PACKET_REMOVE_GUILD_MEMBER
handle_remove_guild_member(client, buffer)
when Constants::PACKET_LEAVE_GUILD
handle_leave_guild(client)
when Constants::PACKET_LEAVE_PARTY
handle_leave_party(client)
when Constants::PACKET_CHOICE
handle_choice(client, buffer)
when Constants::PACKET_BANK_ITEM
handle_bank_item(client, buffer)
when Constants::PACKET_BANK_GOLD
handle_bank_gold(client, buffer)
when Constants::PACKET_CLOSE_WINDOW
handle_close_window(client)
when Constants::PACKET_BUY_ITEM
handle_buy_item(client, buffer)
when Constants::PACKET_SELL_ITEM
handle_sell_item(client, buffer)
when Constants::PACKET_CHOICE_TELEPORT
handle_choice_teleport(client, buffer)
when Constants::PACKET_REQUEST
handle_request(client, buffer)
when Constants::PACKET_ACCEPT_REQUEST
handle_accept_request(client)
when Constants::PACKET_DECLINE_REQUEST
handle_decline_request(client)
when Constants::PACKET_TRADE_ITEM
handle_trade_item(client, buffer)
when Constants::PACKET_TRADE_GOLD
handle_trade_gold(client, buffer)
when Constants::PACKET_LOGOUT
handle_logout(client)
when Constants::PACKET_ADMIN_COMMAND
handle_admin_command(client, buffer)
end
end
def handle_login(client, buffer)
# Altera a codificação padrão do nome de usuário recebido pela Socket do Ruby (ASCII-8BIT)
#para UTF-8, evitando erro ao exibir a mensagem no console do Server.exe. Impede
#que uma mesma conta seja utilizada mais de uma vez
user = buffer.read_string.force_encoding('UTF-8').delete('[/\\\]')
pass = buffer.read_string
version = buffer.read_short
if login_hacking_attempt?(client)
client.close_connection
return
elsif version != Configs::GAME_VERSION
send_failed_login(client, Constants::LOGIN_OLD_VERSION)
# Fecha a conexão somente após a mensagem ser enviada
client.close_connection_after_writing
return
elsif ip_blocked?(client.ip)
send_failed_login(client, Constants::LOGIN_IP_BLOCKED)
client.close_connection_after_writing
return
elsif !Database.account_exist?(user)
send_failed_login(client, Constants::LOGIN_INVALD_USER)
add_attempt(client)
client.close_connection_after_writing
return
elsif banned?(user)
send_failed_login(client, Constants::LOGIN_ACC_BANNED)
client.close_connection_after_writing
return
elsif multi_accounts?(user)
send_failed_login(client, Constants::LOGIN_MULTI_ACCOUNT)
client.close_connection_after_writing
return
end
account = Database.load_account(user)
unless pass == account.pass
send_failed_login(client, Constants::LOGIN_INVALID_PASS)
add_attempt(client)
client.close_connection_after_writing
return
end
client.user = user
client.pass = account.pass
client.email = account.email
client.group = account.group
client.vip_time = account.vip_time
client.actors = account.actors
client.friends = account.friends
client.handshake = true
Database.load_bank(client)
send_login(client)
puts("#{user} logou com o IP #{client.ip}.")
end
def handle_new_account(client, buffer)
# Altera a codificação padrão do nome de usuário recebido pela Socket do Ruby (ASCII-8BIT)
#para UTF-8, evitando erro ao exibir a mensagem no console do Server.exe. Evita
#mais de um cadastro com o mesmo usuário
user = buffer.read_string.strip.force_encoding('UTF-8')
pass = buffer.read_string
email = buffer.read_string
version = buffer.read_short
if client.spawning?
return
elsif new_account_hacking_attempt?(client, user, pass, email)
client.close_connection
return
elsif version != Configs::GAME_VERSION
send_failed_login(client, Constants::LOGIN_OLD_VERSION)
client.close_connection_after_writing
return
elsif ip_blocked?(client.ip)
send_failed_login(client, Constants::LOGIN_IP_BLOCKED)
client.close_connection_after_writing
return
elsif Database.account_exist?(user)
send_new_account(client, Constants::REGISTER_ACC_EXIST)
client.close_connection_after_writing
return
end
client.antispam_time = Time.now + 0.5
Database.create_account(user, pass, email)
send_new_account(client, Constants::REGISTER_SUCCESSFUL)
client.close_connection_after_writing
puts("Conta #{user} criada.")
end
def handle_new_character(client, buffer)
actor_id = buffer.read_byte
name = adjust_name(buffer.read_string.strip)
character_index = buffer.read_byte
class_id = buffer.read_short
sex = buffer.read_byte
params = []
8.times { params << buffer.read_byte }
points = buffer.read_byte
return if client.spawning?
return unless client.logged?
return if actor_id >= Configs::MAX_CHARS
return if client.actors.has_key?(actor_id)
return if name.size < Configs::MIN_CHARACTERS || name.size > Configs::MAX_CHARACTERS
return if invalid_name?(name)
return if illegal_name?(name) && client.standard?
return if class_id < 1 || class_id > client.max_classes
return if sex > Constants::SEX_FEMALE
return if character_index >= $data_classes[class_id].graphics[sex].size
return if params.inject(:+) + points > Configs::START_POINTS
if Database.player_exist?(name)
send_failed_create_character(client)
return
end
client.antispam_time = Time.now + 0.5
Database.create_player(client, actor_id, name, character_index, class_id, sex, params, points)
Database.save_account(client)
send_new_character(client, actor_id, client.actors[actor_id])
end
def handle_remove_character(client, buffer)
actor_id = buffer.read_byte
pass = buffer.read_string
return unless client.actors.has_key?(actor_id)
unless pass == client.pass
send_failed_login(client, Constants::LOGIN_INVALID_PASS)
return
end
Database.remove_player(client.actors[actor_id].name)
if !client.actors[actor_id].guild.empty?
if @guilds[client.actors[actor_id].guild].leader == client.actors[actor_id].name
remove_guild(client.actors[actor_id].guild)
else
@guilds[client.actors[actor_id].guild].members.delete(client.actors[actor_id].name)
save_guild(client.actors[actor_id].guild)
end
end
client.actors.delete(actor_id)
Database.save_account(client)
send_remove_character(client, actor_id)
end
def handle_use_character(client, buffer)
actor_id = buffer.read_byte
return unless client.actors.has_key?(actor_id)
# Define os dados
client.load_data(actor_id)
# Envia os dados para os jogadores que estão no mapa, exceto para o próprio
#jogador que ainda não está conectado
send_player_data(client, client.map_id)
@maps[client.map_id].total_players += 1
# Conecta ao jogo
client.join_game(actor_id)
#global_message("#{client.name} #{Entered}", Configs::ALERT_COLOR)
send_use_character(client)
send_global_switches(client)
send_map_players(client)
send_map_events(client)
send_map_drops(client)
send_motd(client)
end
def handle_player_movement(client, buffer)
d = buffer.read_byte
# Anti-speed hack
#return if client.moving?
return if d < Constants::DIR_DOWN_LEFT || d > Constants::DIR_UP_RIGHT
client.stop_count = Time.now + 0.170
#if d == Constants::DIR_DOWN_LEFT
#client.move_diagonal(4, 2)
#elsif d == Constants::DIR_DOWN_RIGHT
#client.move_diagonal(6, 2)
#elsif d == Constants::DIR_UP_LEFT
#client.move_diagonal(4, 8)
#elsif d == Constants::DIR_UP_RIGHT
#client.move_diagonal(6, 8)
#else
client.move_straight(d)
#end
if client.move_succeed
client.check_touch_event
client.close_windows
end
end
def handle_chat_message(client, buffer)
message = buffer.read_string
talk_type = buffer.read_byte
name = buffer.read_string
return if message.strip.empty?
return if talk_type == Constants::CHAT_GLOBAL && client.global_chat_spawning? && message != '/who'
return if client.spawning?
return if client.muted?
client.antispam_time = Time.now + 0.5
if message == '/who'
whos_online(client)
return
end
message = "#{client.name}: #{chat_filter(message)}"
case talk_type
when Constants::CHAT_MAP
map_message(client.map_id, message, client.id, !client.standard? ? 15 + client.group : Constants::CHAT_MAP)
when Constants::CHAT_GLOBAL
client.global_antispam_time = Time.now + Configs::GLOBAL_ANTISPAM_TIME
global_message(message, !client.standard? ? 15 + client.group : Constants::CHAT_GLOBAL)
when Constants::CHAT_PARTY
party_message(client, message)
when Constants::CHAT_GUILD
guild_message(client, message)
when Constants::CHAT_PRIVATE
private_message(client, message, name)
end
end
def handle_player_attack(client)
return if client.attacking?
if Configs::RANGE_WEAPONS.has_key?(client.weapon_id)
client.attack_range
elsif client.has_weapon?
client.attack_normal
end
client.check_event_trigger_here([0])
client.check_event_trigger_there([0])#([0, 1, 2])
end
def handle_use_item(client, buffer)
item_id = buffer.read_short
return if client.using_item?
# Usa se o item existe, o jogador o tiver e for usável
client.use_item($data_items[item_id])
end
def handle_use_skill(client, buffer)
skill_id = buffer.read_short
return if client.using_item?
client.use_item($data_skills[skill_id])
end
def handle_change_hotbar(client, buffer)
id = buffer.read_byte
type = buffer.read_byte
item_id = buffer.read_short
return if id > Configs::MAX_HOTBAR
client.change_hotbar(id, type, item_id)
end
def handle_use_hotbar(client, buffer)
id = buffer.read_byte
return unless client.hotbar[id]
return if client.using_item?
item_id = client.hotbar[id].item_id
item = client.hotbar[id].type == Constants::HOTBAR_ITEM ? $data_items[item_id] : $data_skills[item_id]
client.use_item(item)
end
def handle_target(client, buffer)
type = buffer.read_byte
target_id = buffer.read_short
client.change_target(target_id, type)
end
def handle_add_drop(client, buffer)
item_id = buffer.read_short
kind = buffer.read_byte
amount = buffer.read_short
item = client.item_object(kind, item_id)
# Impede que o item da troca, que não é removido do inventário, seja dropado
return if client.in_trade?
return if @maps[client.map_id].full_drops?
return if amount < 1 || amount > client.item_number(item)
return if item.soulbound?
return if client.spawning?
client.antispam_time = Time.now + 0.5
client.lose_item(item, amount)
@maps[client.map_id].add_drop(item_id, kind, amount, client.x, client.y)
end
def handle_remove_drop(client, buffer)
drop_id = buffer.read_byte
drop = @maps[client.map_id].drops[drop_id]
return unless drop
return unless client.pos?(drop.x, drop.y)
#return unless client.in_range?(drop, 1)
unless pick_up_drop?(drop, client)
alert_message(client, Constants::ALERT_NOT_PICK_UP_DROP)
return
end
item = client.item_object(drop.kind, drop.item_id)
unless client.full_inventory?(item)
client.gain_item(item, drop.amount, true, true)
@maps[client.map_id].remove_drop(drop_id)
end
end
def handle_player_param(client, buffer)
param_id = buffer.read_byte
return if client.points == 0
client.points -= 1
case param_id
when Constants::PARAM_MAXHP, Constants::PARAM_MAXMP
client.add_param(param_id, 10)
when Constants::PARAM_ATK..Constants::PARAM_LUK
client.add_param(param_id, 1)
end
end
def handle_player_equip(client, buffer)
slot_id = buffer.read_byte
item_id = buffer.read_short
return if client.spawning?
client.antispam_time = Time.now + 0.5
client.change_equip(slot_id, item_id)
end
def handle_open_friends(client)
online_friends = client.friends.select { |name| find_player(name) }
offline_friends = client.friends - online_friends
client.friends = online_friends + offline_friends
client.online_friends_size = online_friends.size
send_open_friends(client, online_friends)
end
def handle_remove_friend(client, buffer)
index = buffer.read_byte
client.friends.delete_at(index)
client.online_friends_size -= 1 if index <= client.online_friends_size - 1
send_remove_friend(client, index)
end
def handle_new_guild(client, buffer)
flag = []
name = adjust_name(buffer.read_string.strip)
64.times { flag << buffer.read_byte }
return unless client.creating_guild?
return if client.in_guild?
return if name.size < Configs::MIN_CHARACTERS || name.size > Configs::MAX_CHARACTERS
return if invalid_name?(name)
create_guild(client, name, flag)
end
def handle_open_guild(client)
return unless client.in_guild?
open_guild(client)
end
def handle_guild_leader(client, buffer)
name = buffer.read_string
return unless client.in_guild? && client.guild_leader?
change_guild_leader(client, name)
end
def handle_guild_notice(client, buffer)
# Altera a codificação padrão da mensagem recebida pela Socket do Ruby (ASCII-8BIT) para UTF-8
notice = buffer.read_string.force_encoding('UTF-8')
return unless client.in_guild?
return unless client.guild_leader?
return if notice.strip.empty? || notice.size > 64
return if client.spawning?
client.antispam_time = Time.now + 0.5
change_guild_notice(client, notice)
end
def handle_remove_guild_member(client, buffer)
name = buffer.read_string
return unless client.in_guild? && client.guild_leader?
member = find_guild_member(@guilds[client.guild], name)
remove_guild_member(client, member) if member && @guilds[client.guild].leader != member
end
def handle_leave_guild(client)
return unless client.in_guild?
if client.guild_leader?
# Possibilita que a guilda seja deletada e que o texto da variável guild dos membros que
#logaram posteriormente ao líder seja apagado, mesmo após a string guild do líder ficar vazia
remove_guild(client.guild.clone)
else
client.leave_guild
end
end
def handle_leave_party(client)
# Sai do grupo se o jogador estiver em um
client.leave_party
end
def handle_choice(client, buffer)
index = buffer.read_byte
return unless client.choosing?
#command = client.choices[0]
#param = command.parameters[0][index]
#client.interpreter.setup(client, client.choices) if param
end
def handle_bank_item(client, buffer)
item_id = buffer.read_short
kind = buffer.read_byte
amount = buffer.read_short
item = client.item_object(kind, item_id)
container = client.bank_item_container(kind)
return unless client.in_bank?
return unless container
# Se o item que está sendo adicionado não existe ou a quantidade é maior que a do inventário
return if amount > 0 && client.item_number(item) < amount
return if amount < 0 && client.bank_item_number(container[item_id]) < amount.abs
return if amount > 0 && client.full_bank?(container[item_id], kind)
return if amount < 0 && client.full_inventory?(item)
return if item.soulbound?
client.gain_bank_item(item_id, kind, amount)
client.lose_item(item, amount)
end
def handle_bank_gold(client, buffer)
amount = buffer.read_int
return unless client.in_bank?
return if amount > 0 && client.gold < amount
return if amount < 0 && client.bank_gold < amount.abs
client.gain_bank_gold(amount)
client.lose_gold(amount)
end
def handle_close_window(client)
client.close_bank
client.close_shop
client.close_trade
client.close_create_guild
end
def handle_buy_item(client, buffer)
index = buffer.read_byte
amount = buffer.read_short.abs
return unless client.in_shop?
return unless client.shop_goods[index]
kind = client.shop_goods[index][0]
item_id = client.shop_goods[index][1]
item = client.item_object(kind + 1, item_id)
price = client.shop_goods[index][2] == 0 ? item.price : client.shop_goods[index][3]
if client.gold >= price * amount && (!client.full_inventory?(item) || amount < 0)
client.gain_item(item, amount)
client.lose_gold(price * amount, true)
end
end
def handle_sell_item(client, buffer)
item_id = buffer.read_short
kind = buffer.read_byte
amount = buffer.read_short.abs
return unless client.in_shop?
return if client.shop_goods[0][4]
item = client.item_object(kind, item_id)
if client.item_number(item) >= amount
client.lose_item(item, amount)
client.gain_gold(amount * item.price / 2, true)
end
end
def handle_choice_teleport(client, buffer)
index = buffer.read_byte
return unless client.in_teleport?
return unless Configs::TELEPORTS[client.teleport_id][index]
return if Configs::TELEPORTS[client.teleport_id][index][3] > client.gold
map_id, x, y, amount = Configs::TELEPORTS[client.teleport_id][index]
client.transfer(map_id, x, y, Constants::DIR_DOWN)
client.lose_gold(amount)
end
def handle_request(client, buffer)
type = buffer.read_byte
player_id = buffer.read_short
return if client.spawning?
client.antispam_time = Time.now + 0.5
case type
when Constants::REQUEST_TRADE
return if requested_unavailable?(client, @clients[player_id])
return if client.in_trade? || client.in_shop? || client.in_bank?
if @clients[player_id].in_trade? || @clients[player_id].in_shop? || @clients[player_id].in_bank?
alert_message(client, Constants::ALERT_BUSY)
return
end
when Constants::REQUEST_FINISH_TRADE
return unless client.in_trade?
player_id = client.trade_player_id
when Constants::REQUEST_PARTY
return if requested_unavailable?(client, @clients[player_id])
return if client.in_party? && @parties[client.party_id].size >= Configs::MAX_PARTY_MEMBERS
if @clients[player_id].in_party?
alert_message(client, Constants::ALERT_IN_PARTY)
return
end
when Constants::REQUEST_FRIEND
return if requested_unavailable?(client, @clients[player_id])
return if client.friends.size >= Configs::MAX_FRIENDS
return if client.friends.include?(@clients[player_id].name)
when Constants::REQUEST_GUILD
return if requested_unavailable?(client, @clients[player_id])
return if !client.in_guild? || @clients[player_id].in_guild?
if !client.guild_leader?
alert_message(client, Constants::ALERT_NOT_GUILD_LEADER)
return
elsif @guilds[client.guild].members.size >= Configs::MAX_GUILD_MEMBERS
alert_message(client, Constants::ALERT_FULL_GUILD)
return
end
end
@clients[player_id].request.id = client.id
@clients[player_id].request.type = type
send_request(@clients[player_id], type, client)
end
def handle_accept_request(client)
case client.request.type
when Constants::REQUEST_TRADE
client.open_trade
when Constants::REQUEST_FINISH_TRADE
client.finish_trade
when Constants::REQUEST_PARTY
client.accept_party
when Constants::REQUEST_FRIEND
client.accept_friend
when Constants::REQUEST_GUILD
client.accept_guild
end
client.clear_request
end
def handle_decline_request(client)
case client.request.type
when Constants::REQUEST_TRADE, Constants::REQUEST_PARTY, Constants::REQUEST_FRIEND, Constants::REQUEST_GUILD
alert_message(@clients[client.request.id], Constants::ALERT_REQUEST_DECLINED) if @clients[client.request.id]&.in_game?
when Constants::REQUEST_FINISH_TRADE
alert_message(@clients[client.request.id], Constants::ALERT_TRADE_DECLINED) if client.in_trade?
end
client.clear_request
end
def handle_trade_item(client, buffer)
item_id = buffer.read_short
kind = buffer.read_byte
amount = buffer.read_short
item = client.item_object(kind, item_id)
container = client.trade_item_container(kind)
return unless client.in_trade?
return unless container
# Se o item que está sendo adicionado não existe ou a quantidade é maior que a do inventário
return if amount > 0 && client.item_number(item) < client.trade_item_number(container[item_id]) + amount
return if amount < 0 && client.trade_item_number(container[item_id]) < amount
return if amount > 0 && client.full_trade?(container[item_id])
return if item.soulbound?
# O item é removido da troca sem precisar verificar se o inventário está cheio, pois a
#quantidade de itens do inventário não é verdadeiramente alterada na troca
client.gain_trade_item(item_id, kind, amount)
client.close_trade_request
end
def handle_trade_gold(client, buffer)
amount = buffer.read_int
return unless client.in_trade?
return if amount > 0 && client.gold < client.trade_gold + amount
return if amount < 0 && client.trade_gold < amount
client.gain_trade_gold(amount)
client.close_trade_request
end
def handle_logout(client)
send_logout(client)
client.leave_game
end
def handle_admin_command(client, buffer)
command = buffer.read_byte
# Altera a codificação padrão da mensagem recebida pela Socket do Ruby (ASCII-8BIT) para UTF-8
str1 = buffer.read_string.force_encoding('UTF-8')
str2 = buffer.read_int
str3 = buffer.read_int
str4 = buffer.read_short
if client.admin?
admin_commands(client, command, str1, str2, str3, str4)
elsif client.monitor?
monitor_commands(client, command, str1, str2, str3, str4)
end
end
end
tknooz- Novato
- Mensagens : 16
Créditos : 0
- Mensagem nº527
Re: VXA-OS - Crie seu MMO com RPG Maker
Sei que seu post não foi destinado a mim,mas a sua questão levantada, é possivel que vc mesmo possa fazer.Adanrox escreveu:Olá Valentine, apenas uma dica que passou despercebido por muito tempo e acredito que muitos irão gostar.
Ataque básico: Atacar sem a permiçao de usar CTRL ou outra alternativa, na minha opinião a dinâmica de jogabilidade iria mudar um pouco sem o uso do botão de ataque, apenas atacar automaticamente ao selecionar o mobs que deseja, até mesmo interagir com npc usando apenas cliques com o mouse. Portanto assim trazendo uma boa expressão para uso do mouse.
No meu projeto de testes coloquei para andar no w,s,d e atacar e interagir com mouse não é nada complexo,basta alguns ajustes.
tknooz- Novato
- Mensagens : 16
Créditos : 0
- Mensagem nº528
Erro ao criar novo equipamento e tentar equipar
Venho novamente por meio deste relatar meu problema.
No meu projeto,preciso que o heroi possa usar 15 slotes,porem o VXA-OS só disponibiliza 9 slotes.
Os scripts responsaveis por mostrar a interface de equipamentos e items são os "[VS] Window _Equip"
e
"[VS] Window _Item"
Pelo que entendi,me corrijam se eu estiver falando besteira,basta cofigurar as coordenadas das janelas,tamanho,largura etc...
Bem como cofigurar o Type das armaduras e acessórios nos slotes do seu projeto.
Sendo assim cada equipamento ao equipar ou desequipar,irá para seu respectivo slot ou para os itens de seu inventário.
Nessa primeira imagem temos a tela de Equip cedida pelo projeto VXA-OS
Nesta segunda imagem temos a primeira imagem modificada por mim para testes no meu projeto.
Nesta terceira imagem podemos ver depois das configurações como fica os equipamentos.
Em seu devidos slots.
Eu posso equipar e desequipar os itens normalmente sem nehum bug.
"OBS" Não posso clicar em nenhum local da janela que não seja na coordenada onde se encontra o item.
Caso eu clique na janela o adjuste faz isso.
Outro problema que eu encontrei foi o seeguinte.
Mesmo eu criando no banco de dados um novo item e definindo seu type,não consigo equipar o item criado.
Mas acredito que dessa vez tenha ficado claro o que eu tentei dizer na outra vez.
Espero que possam me ajudar com este problema.
Desde já agradeço a atenção.
No meu projeto,preciso que o heroi possa usar 15 slotes,porem o VXA-OS só disponibiliza 9 slotes.
Os scripts responsaveis por mostrar a interface de equipamentos e items são os "[VS] Window _Equip"
- Código:
#==============================================================================
# ** Window_Equip
#------------------------------------------------------------------------------
# Esta classe lida com a janela de equipamentos.
#------------------------------------------------------------------------------
# Autor: Valentine
#==============================================================================
class Window_Equip < Window_Base
def initialize
# Quando a resolução é alterada, a coordenada x é
#reajustada no adjust_windows_position da Scene_Map
super(adjust_x, 165, 212, 170)
#Altura = 165
#tamanho-H = 212
#Tamanho-V = 112
self.visible = false
self.closable = true
self.title = Vocab::item
create_desc
end
def adjust_x
Graphics.width - 274
end
def col_max
3
end
def slot_width
29
end
def slot_height
29
end
def show
super
$windows[:item].show
end
def hide
super
$windows[:item].hide
end
def x=(x)
super
$windows[:item].x = x
end
def y=(y)
super
$windows[:item].y = y + 111
end
def sufficient_level?
result = true
if $game_actors[1].level < $windows[:item].item.level
$windows[:chat].write_message(Vocab::InsufficientLevel, Configs::ERROR_COLOR)
result = false
end
result
end
def equip_vip?
result = false
if $windows[:item].item.vip? && !$network.vip?
$windows[:chat].write_message(Vocab::EquipVIP, Configs::ERROR_COLOR)
result = true
end
result
end
def equip_slots
return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] if $game_actors[1].dual_wield?
return [10, 2, 5, 4, 3, 11, 0, 14, 1, 14, 8, 6, 12, 13, 14]
end
def find_equip
result = [nil, -1]
equip_slots.each_with_index do |slot_id, i|
x = i % col_max * slot_width + 62
y = i / col_max * slot_height + 12
if in_area?(x, y, slot_width, slot_height)
result = [$game_actors[1].equips[slot_id], slot_id]
break
end
end
result
end
def refresh
contents.clear
bitmap = Cache.system('Equipments')
contents.blt(50, 0, bitmap, bitmap.rect)
equip_slots.each_with_index do |slot_id, i|
equip = $game_actors[1].equips[slot_id]
x = i % col_max * slot_width + 53
y = i / col_max * slot_height + 3
draw_icon(equip.icon_index, x, y) if equip
end
end
def update
super
unequip_item
update_drag
update_drop
update_desc
end
def unequip_item
return unless Mouse.dbl_clk?(:L)
equip = find_equip[0]
$network.send_player_equip(0, equip.etype_id) if equip && !$game_party.full_inventory?(equip)
end
def update_drag
return unless Mouse.press?(:L)
return if $cursor.object
return if $dragging_window
equip = find_equip[0]
$cursor.change_item(equip, Constants::MOUSE_EQUIP) if equip
end
def update_drop
return if Mouse.press?(:L)
return unless $cursor.object
return unless $cursor.type == Constants::MOUSE_ITEM
return unless $game_actors[1].equippable?($cursor.object)
slot_id = find_equip[1]
$network.send_player_equip($cursor.object.id, slot_id) if slot_id >= 0 && $cursor.object.etype_id == slot_id && sufficient_level? && !equip_vip?
end
def update_desc
return if $dragging_window
equip = find_equip[0]
if equip && !$cursor.object
show_desc(equip)
else
hide_desc
end
end
end
e
"[VS] Window _Item"
- Código:
#==============================================================================
# ** Window_Item
#------------------------------------------------------------------------------
# Esta classe lida com o inventário.
#------------------------------------------------------------------------------
# Autor: Valentine
#==============================================================================
class Window_Item < Window_ItemList
def initialize
# Quando a resolução é alterada, a coordenada x é
#reajustada no adjust_windows_position da Scene_Map
super(adjust_x, 335, 212, 212)
#Altura = 276
#Tamanho-H = 212
#Tamanho-V = 212
self.visible = false
self.windowskin = Cache.system('Window3')
@dragable = false
create_gold_bar
end
def adjust_x
Graphics.width - 274
#274
end
def gold
$game_party.gold - $game_trade.my_gold
end
def enable?(item)
$game_actors[1].usable?(item) || $game_actors[1].equippable?(item)
end
def usable?
item.is_a?(RPG::Item) && $game_player.usable?(item)
end
def make_item_list
@data = $game_party.all_items
end
def draw_item_number(rect, item)
rect.y += 7
draw_text(rect, $game_party.item_number(item) - $game_trade.my_item_number(item), 2)
end
def update
super
double_click
drop_item
end
def double_click
return unless Mouse.dbl_clk?(:L)
return unless index >= 0
if $windows[:shop].visible
$windows[:shop].sell_item
elsif $windows[:trade].visible
$windows[:amount].show(Constants::AMOUNT_ADD_TRADE_ITEM, item)
elsif $windows[:bank].visible
$windows[:amount].show(Constants::AMOUNT_DEPOSIT_ITEM, item)
elsif item.is_a?(RPG::EquipItem) && $windows[:equip].sufficient_level? && !$windows[:equip].equip_vip?
$network.send_player_equip(item.id, item.etype_id)
elsif item.is_a?(RPG::Item)
use_item
end
end
def use_item
return if $game_player.item_attack_time > Time.now
$game_player.item_attack_time = Time.now + Configs::COOLDOWN_SKILL_TIME
$network.send_use_item(item.id) if usable?
end
def drop_item
return unless Mouse.click?(:R)
return unless index >= 0
return if $windows[:trade].visible
$windows[:amount].show(Constants::AMOUNT_DROP_ITEM, item)
end
def update_drag
return unless Mouse.press?(:L)
return if $cursor.object
return if $dragging_window
return unless index >= 0
$cursor.change_item(item, Constants::MOUSE_ITEM)
end
def update_drop
return if Mouse.press?(:L)
return unless $cursor.object
return unless in_area?
case $cursor.type
when Constants::MOUSE_EQUIP
$network.send_player_equip(0, $cursor.object.etype_id) unless $game_party.full_inventory?($cursor.object)
when Constants::MOUSE_SHOP
$windows[:amount].show(Constants::AMOUNT_BUY_ITEM, $cursor.object, $windows[:shop].index)
when Constants::MOUSE_TRADE
$windows[:amount].show(Constants::AMOUNT_REMOVE_TRADE_ITEM, $cursor.object)
when Constants::MOUSE_BANK
$windows[:amount].show(Constants::AMOUNT_WITHDRAW_ITEM, $cursor.object)
end
end
end
Pelo que entendi,me corrijam se eu estiver falando besteira,basta cofigurar as coordenadas das janelas,tamanho,largura etc...
Bem como cofigurar o Type das armaduras e acessórios nos slotes do seu projeto.
Sendo assim cada equipamento ao equipar ou desequipar,irá para seu respectivo slot ou para os itens de seu inventário.
Nessa primeira imagem temos a tela de Equip cedida pelo projeto VXA-OS
- Spoiler:
Nesta segunda imagem temos a primeira imagem modificada por mim para testes no meu projeto.
- Spoiler:
Nesta terceira imagem podemos ver depois das configurações como fica os equipamentos.
Em seu devidos slots.
- Spoiler:
Eu posso equipar e desequipar os itens normalmente sem nehum bug.
"OBS" Não posso clicar em nenhum local da janela que não seja na coordenada onde se encontra o item.
Caso eu clique na janela o adjuste faz isso.
- Spoiler:
Outro problema que eu encontrei foi o seeguinte.
Mesmo eu criando no banco de dados um novo item e definindo seu type,não consigo equipar o item criado.
- Spoiler:
- Spoiler:
Mas acredito que dessa vez tenha ficado claro o que eu tentei dizer na outra vez.
Espero que possam me ajudar com este problema.
Desde já agradeço a atenção.
- Mensagem nº529
Re: VXA-OS - Crie seu MMO com RPG Maker
Você precisa mexer no def y do script [VS] Window_Equip para que a Window_Item fique um pouco mais embaixo, já que você está aumentando o tamanho da Window_Equip.tknooz escreveu:Venho novamente por meio deste relatar meu problema.
No meu projeto,preciso que o heroi possa usar 15 slotes,porem o VXA-OS só disponibiliza 9 slotes.
Os scripts responsaveis por mostrar a interface de equipamentos e items são os "[VS] Window _Equip"
- Código:
#==============================================================================
# ** Window_Equip
#------------------------------------------------------------------------------
# Esta classe lida com a janela de equipamentos.
#------------------------------------------------------------------------------
# Autor: Valentine
#==============================================================================
class Window_Equip < Window_Base
def initialize
# Quando a resolução é alterada, a coordenada x é
#reajustada no adjust_windows_position da Scene_Map
super(adjust_x, 165, 212, 170)
#Altura = 165
#tamanho-H = 212
#Tamanho-V = 112
self.visible = false
self.closable = true
self.title = Vocab::item
create_desc
end
def adjust_x
Graphics.width - 274
end
def col_max
3
end
def slot_width
29
end
def slot_height
29
end
def show
super
$windows[:item].show
end
def hide
super
$windows[:item].hide
end
def x=(x)
super
$windows[:item].x = x
end
def y=(y)
super
$windows[:item].y = y + 111
end
def sufficient_level?
result = true
if $game_actors[1].level < $windows[:item].item.level
$windows[:chat].write_message(Vocab::InsufficientLevel, Configs::ERROR_COLOR)
result = false
end
result
end
def equip_vip?
result = false
if $windows[:item].item.vip? && !$network.vip?
$windows[:chat].write_message(Vocab::EquipVIP, Configs::ERROR_COLOR)
result = true
end
result
end
def equip_slots
return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] if $game_actors[1].dual_wield?
return [10, 2, 5, 4, 3, 11, 0, 14, 1, 14, 8, 6, 12, 13, 14]
end
def find_equip
result = [nil, -1]
equip_slots.each_with_index do |slot_id, i|
x = i % col_max * slot_width + 62
y = i / col_max * slot_height + 12
if in_area?(x, y, slot_width, slot_height)
result = [$game_actors[1].equips[slot_id], slot_id]
break
end
end
result
end
def refresh
contents.clear
bitmap = Cache.system('Equipments')
contents.blt(50, 0, bitmap, bitmap.rect)
equip_slots.each_with_index do |slot_id, i|
equip = $game_actors[1].equips[slot_id]
x = i % col_max * slot_width + 53
y = i / col_max * slot_height + 3
draw_icon(equip.icon_index, x, y) if equip
end
end
def update
super
unequip_item
update_drag
update_drop
update_desc
end
def unequip_item
return unless Mouse.dbl_clk?(:L)
equip = find_equip[0]
$network.send_player_equip(0, equip.etype_id) if equip && !$game_party.full_inventory?(equip)
end
def update_drag
return unless Mouse.press?(:L)
return if $cursor.object
return if $dragging_window
equip = find_equip[0]
$cursor.change_item(equip, Constants::MOUSE_EQUIP) if equip
end
def update_drop
return if Mouse.press?(:L)
return unless $cursor.object
return unless $cursor.type == Constants::MOUSE_ITEM
return unless $game_actors[1].equippable?($cursor.object)
slot_id = find_equip[1]
$network.send_player_equip($cursor.object.id, slot_id) if slot_id >= 0 && $cursor.object.etype_id == slot_id && sufficient_level? && !equip_vip?
end
def update_desc
return if $dragging_window
equip = find_equip[0]
if equip && !$cursor.object
show_desc(equip)
else
hide_desc
end
end
end
e
"[VS] Window _Item"
- Código:
#==============================================================================
# ** Window_Item
#------------------------------------------------------------------------------
# Esta classe lida com o inventário.
#------------------------------------------------------------------------------
# Autor: Valentine
#==============================================================================
class Window_Item < Window_ItemList
def initialize
# Quando a resolução é alterada, a coordenada x é
#reajustada no adjust_windows_position da Scene_Map
super(adjust_x, 335, 212, 212)
#Altura = 276
#Tamanho-H = 212
#Tamanho-V = 212
self.visible = false
self.windowskin = Cache.system('Window3')
@dragable = false
create_gold_bar
end
def adjust_x
Graphics.width - 274
#274
end
def gold
$game_party.gold - $game_trade.my_gold
end
def enable?(item)
$game_actors[1].usable?(item) || $game_actors[1].equippable?(item)
end
def usable?
item.is_a?(RPG::Item) && $game_player.usable?(item)
end
def make_item_list
@data = $game_party.all_items
end
def draw_item_number(rect, item)
rect.y += 7
draw_text(rect, $game_party.item_number(item) - $game_trade.my_item_number(item), 2)
end
def update
super
double_click
drop_item
end
def double_click
return unless Mouse.dbl_clk?(:L)
return unless index >= 0
if $windows[:shop].visible
$windows[:shop].sell_item
elsif $windows[:trade].visible
$windows[:amount].show(Constants::AMOUNT_ADD_TRADE_ITEM, item)
elsif $windows[:bank].visible
$windows[:amount].show(Constants::AMOUNT_DEPOSIT_ITEM, item)
elsif item.is_a?(RPG::EquipItem) && $windows[:equip].sufficient_level? && !$windows[:equip].equip_vip?
$network.send_player_equip(item.id, item.etype_id)
elsif item.is_a?(RPG::Item)
use_item
end
end
def use_item
return if $game_player.item_attack_time > Time.now
$game_player.item_attack_time = Time.now + Configs::COOLDOWN_SKILL_TIME
$network.send_use_item(item.id) if usable?
end
def drop_item
return unless Mouse.click?(:R)
return unless index >= 0
return if $windows[:trade].visible
$windows[:amount].show(Constants::AMOUNT_DROP_ITEM, item)
end
def update_drag
return unless Mouse.press?(:L)
return if $cursor.object
return if $dragging_window
return unless index >= 0
$cursor.change_item(item, Constants::MOUSE_ITEM)
end
def update_drop
return if Mouse.press?(:L)
return unless $cursor.object
return unless in_area?
case $cursor.type
when Constants::MOUSE_EQUIP
$network.send_player_equip(0, $cursor.object.etype_id) unless $game_party.full_inventory?($cursor.object)
when Constants::MOUSE_SHOP
$windows[:amount].show(Constants::AMOUNT_BUY_ITEM, $cursor.object, $windows[:shop].index)
when Constants::MOUSE_TRADE
$windows[:amount].show(Constants::AMOUNT_REMOVE_TRADE_ITEM, $cursor.object)
when Constants::MOUSE_BANK
$windows[:amount].show(Constants::AMOUNT_WITHDRAW_ITEM, $cursor.object)
end
end
end
Pelo que entendi,me corrijam se eu estiver falando besteira,basta cofigurar as coordenadas das janelas,tamanho,largura etc...
Bem como cofigurar o Type das armaduras e acessórios nos slotes do seu projeto.
Sendo assim cada equipamento ao equipar ou desequipar,irá para seu respectivo slot ou para os itens de seu inventário.
Nessa primeira imagem temos a tela de Equip cedida pelo projeto VXA-OS
- Spoiler:
Nesta segunda imagem temos a primeira imagem modificada por mim para testes no meu projeto.
- Spoiler:
Nesta terceira imagem podemos ver depois das configurações como fica os equipamentos.
Em seu devidos slots.Como podem perceber,até então não há nehum erro.
- Spoiler:
Eu posso equipar e desequipar os itens normalmente sem nehum bug.
"OBS" Não posso clicar em nenhum local da janela que não seja na coordenada onde se encontra o item.
Caso eu clique na janela o adjuste faz isso.
- Spoiler:
Outro problema que eu encontrei foi o seeguinte.
Mesmo eu criando no banco de dados um novo item e definindo seu type,não consigo equipar o item criado.Caso eu tente equipar o item criado,ocorre esses erros.
- Spoiler:
Na outra vez que vim com este meu problema aqui no forum,meu tópico estava bem bagunçado, peço desculpas por isso.
- Spoiler:
Mas acredito que dessa vez tenha ficado claro o que eu tentei dizer na outra vez.
Espero que possam me ajudar com este problema.
Desde já agradeço a atenção.
Também é necessário mexer no servidor. Eu não lembro agora todos os lugares que você precisa modificar, mas pelo menos no arquivo database.rb (def self.create_player e def self.load_player) e game_client.rb vai ser necessário.
tknooz- Novato
- Mensagens : 16
Créditos : 0
- Mensagem nº530
Re: VXA-OS - Crie seu MMO com RPG Maker
Obrigado pela resposta.Valentine escreveu:Você precisa mexer no def y do script [VS] Window_Equip para que a Window_Item fique um pouco mais embaixo, já que você está aumentando o tamanho da Window_Equip.tknooz escreveu:Venho novamente por meio deste relatar meu problema.
No meu projeto,preciso que o heroi possa usar 15 slotes,porem o VXA-OS só disponibiliza 9 slotes.
Os scripts responsaveis por mostrar a interface de equipamentos e items são os "[VS] Window _Equip"
- Código:
#==============================================================================
# ** Window_Equip
#------------------------------------------------------------------------------
# Esta classe lida com a janela de equipamentos.
#------------------------------------------------------------------------------
# Autor: Valentine
#==============================================================================
class Window_Equip < Window_Base
def initialize
# Quando a resolução é alterada, a coordenada x é
#reajustada no adjust_windows_position da Scene_Map
super(adjust_x, 165, 212, 170)
#Altura = 165
#tamanho-H = 212
#Tamanho-V = 112
self.visible = false
self.closable = true
self.title = Vocab::item
create_desc
end
def adjust_x
Graphics.width - 274
end
def col_max
3
end
def slot_width
29
end
def slot_height
29
end
def show
super
$windows[:item].show
end
def hide
super
$windows[:item].hide
end
def x=(x)
super
$windows[:item].x = x
end
def y=(y)
super
$windows[:item].y = y + 111
end
def sufficient_level?
result = true
if $game_actors[1].level < $windows[:item].item.level
$windows[:chat].write_message(Vocab::InsufficientLevel, Configs::ERROR_COLOR)
result = false
end
result
end
def equip_vip?
result = false
if $windows[:item].item.vip? && !$network.vip?
$windows[:chat].write_message(Vocab::EquipVIP, Configs::ERROR_COLOR)
result = true
end
result
end
def equip_slots
return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] if $game_actors[1].dual_wield?
return [10, 2, 5, 4, 3, 11, 0, 14, 1, 14, 8, 6, 12, 13, 14]
end
def find_equip
result = [nil, -1]
equip_slots.each_with_index do |slot_id, i|
x = i % col_max * slot_width + 62
y = i / col_max * slot_height + 12
if in_area?(x, y, slot_width, slot_height)
result = [$game_actors[1].equips[slot_id], slot_id]
break
end
end
result
end
def refresh
contents.clear
bitmap = Cache.system('Equipments')
contents.blt(50, 0, bitmap, bitmap.rect)
equip_slots.each_with_index do |slot_id, i|
equip = $game_actors[1].equips[slot_id]
x = i % col_max * slot_width + 53
y = i / col_max * slot_height + 3
draw_icon(equip.icon_index, x, y) if equip
end
end
def update
super
unequip_item
update_drag
update_drop
update_desc
end
def unequip_item
return unless Mouse.dbl_clk?(:L)
equip = find_equip[0]
$network.send_player_equip(0, equip.etype_id) if equip && !$game_party.full_inventory?(equip)
end
def update_drag
return unless Mouse.press?(:L)
return if $cursor.object
return if $dragging_window
equip = find_equip[0]
$cursor.change_item(equip, Constants::MOUSE_EQUIP) if equip
end
def update_drop
return if Mouse.press?(:L)
return unless $cursor.object
return unless $cursor.type == Constants::MOUSE_ITEM
return unless $game_actors[1].equippable?($cursor.object)
slot_id = find_equip[1]
$network.send_player_equip($cursor.object.id, slot_id) if slot_id >= 0 && $cursor.object.etype_id == slot_id && sufficient_level? && !equip_vip?
end
def update_desc
return if $dragging_window
equip = find_equip[0]
if equip && !$cursor.object
show_desc(equip)
else
hide_desc
end
end
end
e
"[VS] Window _Item"
- Código:
#==============================================================================
# ** Window_Item
#------------------------------------------------------------------------------
# Esta classe lida com o inventário.
#------------------------------------------------------------------------------
# Autor: Valentine
#==============================================================================
class Window_Item < Window_ItemList
def initialize
# Quando a resolução é alterada, a coordenada x é
#reajustada no adjust_windows_position da Scene_Map
super(adjust_x, 335, 212, 212)
#Altura = 276
#Tamanho-H = 212
#Tamanho-V = 212
self.visible = false
self.windowskin = Cache.system('Window3')
@dragable = false
create_gold_bar
end
def adjust_x
Graphics.width - 274
#274
end
def gold
$game_party.gold - $game_trade.my_gold
end
def enable?(item)
$game_actors[1].usable?(item) || $game_actors[1].equippable?(item)
end
def usable?
item.is_a?(RPG::Item) && $game_player.usable?(item)
end
def make_item_list
@data = $game_party.all_items
end
def draw_item_number(rect, item)
rect.y += 7
draw_text(rect, $game_party.item_number(item) - $game_trade.my_item_number(item), 2)
end
def update
super
double_click
drop_item
end
def double_click
return unless Mouse.dbl_clk?(:L)
return unless index >= 0
if $windows[:shop].visible
$windows[:shop].sell_item
elsif $windows[:trade].visible
$windows[:amount].show(Constants::AMOUNT_ADD_TRADE_ITEM, item)
elsif $windows[:bank].visible
$windows[:amount].show(Constants::AMOUNT_DEPOSIT_ITEM, item)
elsif item.is_a?(RPG::EquipItem) && $windows[:equip].sufficient_level? && !$windows[:equip].equip_vip?
$network.send_player_equip(item.id, item.etype_id)
elsif item.is_a?(RPG::Item)
use_item
end
end
def use_item
return if $game_player.item_attack_time > Time.now
$game_player.item_attack_time = Time.now + Configs::COOLDOWN_SKILL_TIME
$network.send_use_item(item.id) if usable?
end
def drop_item
return unless Mouse.click?(:R)
return unless index >= 0
return if $windows[:trade].visible
$windows[:amount].show(Constants::AMOUNT_DROP_ITEM, item)
end
def update_drag
return unless Mouse.press?(:L)
return if $cursor.object
return if $dragging_window
return unless index >= 0
$cursor.change_item(item, Constants::MOUSE_ITEM)
end
def update_drop
return if Mouse.press?(:L)
return unless $cursor.object
return unless in_area?
case $cursor.type
when Constants::MOUSE_EQUIP
$network.send_player_equip(0, $cursor.object.etype_id) unless $game_party.full_inventory?($cursor.object)
when Constants::MOUSE_SHOP
$windows[:amount].show(Constants::AMOUNT_BUY_ITEM, $cursor.object, $windows[:shop].index)
when Constants::MOUSE_TRADE
$windows[:amount].show(Constants::AMOUNT_REMOVE_TRADE_ITEM, $cursor.object)
when Constants::MOUSE_BANK
$windows[:amount].show(Constants::AMOUNT_WITHDRAW_ITEM, $cursor.object)
end
end
end
Pelo que entendi,me corrijam se eu estiver falando besteira,basta cofigurar as coordenadas das janelas,tamanho,largura etc...
Bem como cofigurar o Type das armaduras e acessórios nos slotes do seu projeto.
Sendo assim cada equipamento ao equipar ou desequipar,irá para seu respectivo slot ou para os itens de seu inventário.
Nessa primeira imagem temos a tela de Equip cedida pelo projeto VXA-OS
- Spoiler:
Nesta segunda imagem temos a primeira imagem modificada por mim para testes no meu projeto.
- Spoiler:
Nesta terceira imagem podemos ver depois das configurações como fica os equipamentos.
Em seu devidos slots.Como podem perceber,até então não há nehum erro.
- Spoiler:
Eu posso equipar e desequipar os itens normalmente sem nehum bug.
"OBS" Não posso clicar em nenhum local da janela que não seja na coordenada onde se encontra o item.
Caso eu clique na janela o adjuste faz isso.
- Spoiler:
Outro problema que eu encontrei foi o seeguinte.
Mesmo eu criando no banco de dados um novo item e definindo seu type,não consigo equipar o item criado.Caso eu tente equipar o item criado,ocorre esses erros.
- Spoiler:
Na outra vez que vim com este meu problema aqui no forum,meu tópico estava bem bagunçado, peço desculpas por isso.
- Spoiler:
Mas acredito que dessa vez tenha ficado claro o que eu tentei dizer na outra vez.
Espero que possam me ajudar com este problema.
Desde já agradeço a atenção.
Também é necessário mexer no servidor. Eu não lembro agora todos os lugares que você precisa modificar, mas pelo menos no arquivo database.rb (def self.create_player e def self.load_player) e game_client.rb vai ser necessário.
Irei dar uma olhada nos scripts citados.
Qualquer problema ou erro que ocorrer voltarei aqui.