HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0112
Crystalpropertiesファイルを読み書きしたい10解決


Crystal

リンク

2022/1/12(Wed) 14:11:08|NO.94980

Minecraftのサーバーにある server.properties を読み込んで、簡単に編集できるようにするアプリを作っているのですが、どのようにすればいいかわかりません。
というのも、server.propertiesの内容が、

gamemode=survival maxplayers=20 etc...
のように、=の後に、設定する値が来ており、これを正確に読み込みたいと考えています。 ini読み書きモジュールを調べてみたのですが、それだと、ini特有の最初に、

[settings] ....= .....
のように、[settings]の部分が必要になってしまい、これではサーバーの方でエラーが出てしまいます。
どうすれば、gamemode=以下の部分を読み込んで、値代入→保存の形にできるでしょうか?
説明がわかりにくくて申し訳ありません。教えていただけると幸いです。
(事前に調べたりはしていますが、検索ワードによってヒットするものとそうではないものがあり、見逃している可能性もありますが教えていただけると幸いです)



この記事に返信する


ねんねこ5787

リンク

2022/1/12(Wed) 15:54:06|NO.94981

mod_regexp.asを使えば文字列の読出しはできると思います
書き出しはわかりません



しまくろねこ

リンク

2022/1/12(Wed) 18:31:53|NO.94983

サーバからの読み込み&書き出しはよくわかりませんが、ローカルだと以下の感じ?
Minecraftのデータファイルについてはよくわかりません。
適当ですいません。

#define FILE_NAME "server.properties" #const STR_LENGTH 255 //---------------------------------------------- *start exist FILE_NAME if strsize != -1 { sdim all_buff, strsize bload FILE_NAME, all_buff, -1 notesel all_buff n_max = 0 repeat notemax noteget line_buff, cnt if strmid(line_buff, 0, 1) == "#" || strlen(line_buff) == 0 : continue n_max++ loop sdim txt_buff, STR_LENGTH, n_max sdim tag, STR_LENGTH, n_max sdim value, STR_LENGTH, n_max dim obj_id, n_max repeat n_max pos 150, cnt * 20 + 10 input txt_buff(cnt), 100, 20 obj_id(cnt) = stat noteget line_buff, cnt split line_buff, "=", tag(cnt), value(cnt) objprm obj_id(cnt), value(cnt) pos 10, cnt * 20 + 10 mes tag(cnt) loop } else { dialog FILE_NAME + "がありません。\n終了します。" end } objsize 100, 50 pos 300, 10 : button gosub "保存", *file_write stop //---------------------------------------------- *file_write write_buff = "" repeat n_max write_buff += tag(cnt) + "=" + txt_buff(cnt) + "\n" loop bsave FILE_NAME, write_buff, strlen(write_buff) return



Crystal

リンク

2022/1/12(Wed) 21:03:58|NO.94984

>NO.94981
HSPの正規表現を使って取得する際、ファイルがtrue、false以外にint型があった場合、複数別々に処理する必要があるのでちょっと大変かなと思いました。
この際の処理をどのようにするのか、ちょっとわからないです。(true,false,int型別々に正規表現で取得する方法です)

>NO.94983
ローカル環境での取得モジュールを教えてくださりありがとうございます。無事すべての値を取得できました。 追加で質問になるのですが、「#」がつく行を排除することと、
gamemode = creative でこのモジュールを使うと、 gamemode [creative]となっていて、このmes表記のgamemodeの部分を"ゲームモード"のように特定の文字に変更することは
可能でしょうか? あくまで画面上で表示して、 server.propertiesにはgamemodeとして読み込む感じです。追加で申し訳ありませんが教えていただけないでしょうか?



しまくろねこ

リンク

2022/1/12(Wed) 21:38:37|NO.94985

すいません。よくわかっていません。
こうでしょうか?

#define FILE_NAME "server.properties" #module #defcfunc cfunc_get_replace_name str tag replace_name = tag switch tag case "gamemode" : replace_name = "ゲームモード" : swbreak case "max-players" : replace_name = "最大プレイヤー数" : swbreak //case "元の名称" : replace_name = "表示したい名称" : swbreak ; 変更したい分下の行にコピーしてください。 swend return replace_name #global //---------------------------------------------- *start exist FILE_NAME if strsize != -1 { sdim all_buff, strsize bload FILE_NAME, all_buff, -1 notesel all_buff c = 0 repeat notemax noteget line_buff, c if strmid(line_buff, 0, 1) == "#" { notedel c continue } c++ loop index = 0 txt_buff = "" pos 10, 10 : objsize 300, 450 : listbox index, 0, all_buff : obj_id_listbox = stat pos 320, 30 : input txt_buff, 200, 20 : obj_id_input = stat } else { dialog FILE_NAME + "がありません。\n終了します。" end } pos 530, 30 : objsize 100, 20 : button gosub "更新", *update pos 400, 100 : objsize 100, 50 : button gosub "保存", *file_write tag = "" value = "" index = 0 index_2 = -1 repeat redraw 0 syscolor 5 : boxf if index != index_2 { noteget line_buff, index split line_buff, "=", tag, value objprm obj_id_input, value } pos 320, 10 : color 0, 0, 0 : mes cfunc_get_replace_name(tag) index_2 = index wait 1 redraw 1 loop //---------------------------------------------- *update noteget line_buff, index if strmid(line_buff, 0, 1) != "#" && strlen(line_buff) != 0 { noteadd tag + "=" + txt_buff, index, 1 objprm obj_id_listbox, all_buff } return //---------------------------------------------- *file_write bsave FILE_NAME, all_buff, strlen(all_buff) return



しまくろねこ

リンク

2022/1/12(Wed) 22:21:56|NO.94987

こうかな?

#define FILE_NAME "server.properties" #module #defcfunc cfunc_get_replace_name str tag replace_name = tag switch tag case "gamemode" : replace_name = "ゲームモード" : swbreak case "max-players" : replace_name = "最大プレイヤー数" : swbreak //case "元の名称" : replace_name = "表示したい名称" : swbreak ; 変更したい分下の行にコピーしてください。 swend return replace_name #global //---------------------------------------------- *start exist FILE_NAME if strsize != -1 { sdim all_buff, strsize bload FILE_NAME, all_buff, -1 save_all_buff = all_buff notesel all_buff gosub *listbox_in_buff index = 0 txt_buff = "" pos 10, 10 : objsize 300, 450 : listbox index, 0, all_buff : obj_id_listbox = stat pos 320, 30 : input txt_buff, 200, 20 : obj_id_input = stat } else { dialog FILE_NAME + "がありません。\n終了します。" end } pos 530, 30 : objsize 100, 20 : button gosub "更新", *update pos 400, 100 : objsize 100, 50 : button gosub "保存", *file_write index_2 = -1 repeat redraw 0 syscolor 5 : boxf if index != index_2 { notesel all_buff noteget line_buff, index split line_buff, "=", tag, value objprm obj_id_input, value } pos 320, 10 : color 0, 0, 0 : mes cfunc_get_replace_name(tag) index_2 = index wait 1 redraw 1 loop //---------------------------------------------- *listbox_in_buff tag = "" value = "" c = 0 repeat notemax noteget line_buff, c if strmid(line_buff, 0, 1) == "#" { notedel c continue } split line_buff, "=", tag, value tag = cfunc_get_replace_name(tag) noteadd tag + "=" + value, c, 1 c++ loop return //---------------------------------------------- *update notesel all_buff noteget line_buff, index split line_buff, "=", tag, value noteadd cfunc_get_replace_name(tag) + "=" + txt_buff, index, 1 gosub *listbox_in_buff noteunsel notesel save_all_buff noteget line_buff, index split line_buff, "=", tag, value noteadd tag + "=" + txt_buff, index, 1 noteunsel objprm obj_id_listbox, all_buff return //---------------------------------------------- *file_write bsave FILE_NAME, save_all_buff, strlen(save_all_buff) return



Crystal

リンク

2022/1/12(Wed) 23:03:44|NO.94988

>NO.94985
説明不足で申し訳ありません。
そのソースで例えば、max-playersなら、一括で表記を "最大プレイヤー数:"みたいに変更したいです。
画像参照:https://uploda1.ysklog.net/uploda/b32d4bf98c.png
詳しく説明しますと、左のリストボックスにある文字列をgamemode , MaxPlayersをそれぞれ、"ゲームモード","最大プレイヤー数"に置き換えて、
右にある編集画面でも同じことをしたいと考えています。(本当に分かりにくくてごめんなさい... 伝え方がちょっとわからなくて...)
まだ、左のボックスで"="以下省略したいです。文字列操作についてあまりわかっていなくて、書いてくださったソースコードをどのように修正すべきかめどが立っていません。
(パラメータの文字変えると毎回無効なパラメータ扱いになり、困っています...)
わかりにくいうえ、二度手間をさせてしまい申し訳ありません...



しまくろねこ

リンク

2022/1/13(Thu) 07:51:54|NO.94990

>左のリストボックスにある文字列をgamemode , MaxPlayersをそれぞれ、"ゲームモード","最大プレイヤー数"に置き換えて
「//case "元の名称" : replace_name = "表示したい名称" : swbreak ; 変更したい分下の行にコピーしてください。」
の行をコピー&ペーストで複製していってください。
先頭の「//」は削除してください。

>左のボックスで"="以下省略したいです。
NO.94987のソースを少し手直ししただけなので無駄な処理があるかもしれませんが以下でよろしいでしょうか?

#define FILE_NAME "server.properties" #module #defcfunc cfunc_get_replace_name str tag replace_name = tag switch tag case "gamemode" : replace_name = "ゲームモード" : swbreak case "max-players" : replace_name = "最大プレイヤー数" : swbreak //case "元の名称" : replace_name = "表示したい名称" : swbreak ; 変更したい分下の行にコピーしてください。 swend return replace_name #global //---------------------------------------------- *start exist FILE_NAME if strsize != -1 { sdim all_buff, strsize bload FILE_NAME, all_buff, -1 save_all_buff = all_buff notesel all_buff gosub *listbox_in_buff index = 0 txt_buff = "" pos 10, 10 : objsize 300, 450 : listbox index, 0, all_buff : obj_id_listbox = stat pos 320, 30 : input txt_buff, 200, 20 : obj_id_input = stat } else { dialog FILE_NAME + "がありません。\n終了します。" end } pos 530, 30 : objsize 100, 20 : button gosub "更新", *update pos 400, 100 : objsize 100, 50 : button gosub "保存", *file_write index_2 = -1 repeat redraw 0 syscolor 5 : boxf if index != index_2 { notesel save_all_buff noteget line_buff, index split line_buff, "=", tag, value objprm obj_id_input, value } pos 320, 10 : color 0, 0, 0 : mes cfunc_get_replace_name(tag) index_2 = index wait 1 redraw 1 loop //---------------------------------------------- *listbox_in_buff tag = "" value = "" c = 0 repeat notemax noteget line_buff, c if strmid(line_buff, 0, 1) == "#" || strlen(line_buff) == 0 { notedel c continue } split line_buff, "=", tag, value tag = cfunc_get_replace_name(tag) noteadd tag, c, 1 c++ loop return //---------------------------------------------- *update notesel all_buff noteget line_buff, index split line_buff, "=", tag, value noteadd cfunc_get_replace_name(tag) + "=" + txt_buff, index, 1 gosub *listbox_in_buff noteunsel notesel save_all_buff noteget line_buff, index split line_buff, "=", tag, value noteadd tag + "=" + txt_buff, index, 1 noteunsel objprm obj_id_listbox, all_buff return //---------------------------------------------- *file_write c = 0 notesel save_all_buff repeat notemax noteget line_buff, c if strmid(line_buff, 0, 1) == "#" || strlen(line_buff) == 0 { notedel c continue } c++ loop bsave FILE_NAME, save_all_buff, strlen(save_all_buff) return



Crystal

リンク

2022/1/13(Thu) 08:57:44|NO.94991

すみません、今度は、右の編集する方に"#"が除外されていなくて、左と2行分ずれているのですが、これはどうすればいいでしょうか?
ソースコードの方は、私が行いたいのと同じものでいいのですが...
何度もすみません...



しまくろねこ

リンク

2022/1/13(Thu) 16:32:56|NO.95004

>右の編集する方に"#"が除外されていなくて、左と2行分ずれているのですが、
確認不足でした。
下記のソースでズレが直ります。

#define FILE_NAME "server.properties" #module #defcfunc cfunc_get_replace_name str tag replace_name = tag switch tag case "gamemode" : replace_name = "ゲームモード" : swbreak case "max-players" : replace_name = "最大プレイヤー数" : swbreak //case "元の名称" : replace_name = "表示したい名称" : swbreak ; 変更したい分下の行にコピーしてください。 swend return replace_name #global //---------------------------------------------- *start exist FILE_NAME if strsize != -1 { sdim all_buff, strsize bload FILE_NAME, all_buff, -1 save_all_buff = all_buff gosub *save_all_buff_cut notesel all_buff gosub *listbox_in_buff index = 0 txt_buff = "" pos 10, 10 : objsize 300, 450 : listbox index, 0, all_buff : obj_id_listbox = stat pos 320, 30 : input txt_buff, 200, 20 : obj_id_input = stat } else { dialog FILE_NAME + "がありません。\n終了します。" end } pos 530, 30 : objsize 100, 20 : button gosub "更新", *update pos 400, 100 : objsize 100, 50 : button gosub "保存", *file_write index_2 = -1 objsel obj_id_listbox //---------------------------------------------- *main repeat redraw 0 syscolor 5 : boxf if index != index_2 { notesel save_all_buff noteget line_buff, index split line_buff, "=", tag, value objprm obj_id_input, value } pos 320, 10 : color 0, 0, 0 : mes cfunc_get_replace_name(tag) index_2 = index wait 1 redraw 1 loop //---------------------------------------------- *listbox_in_buff tag = "" value = "" c = 0 repeat notemax noteget line_buff, c if strmid(line_buff, 0, 1) == "#" || strlen(line_buff) == 0 { notedel c continue } split line_buff, "=", tag, value tag = cfunc_get_replace_name(tag) noteadd tag, c, 1 c++ loop return //---------------------------------------------- *save_all_buff_cut c = 0 notesel save_all_buff repeat notemax noteget line_buff, c if strmid(line_buff, 0, 1) == "#" || strlen(line_buff) == 0 { notedel c continue } c++ loop noteunsel return //---------------------------------------------- *update notesel all_buff noteget line_buff, index split line_buff, "=", tag, value noteadd cfunc_get_replace_name(tag) + "=" + txt_buff, index, 1 gosub *listbox_in_buff noteunsel notesel save_all_buff noteget line_buff, index split line_buff, "=", tag, value noteadd tag + "=" + txt_buff, index, 1 noteunsel objprm obj_id_listbox, all_buff return //---------------------------------------------- *file_write gosub *save_all_buff_cut bsave FILE_NAME, save_all_buff, strlen(save_all_buff) dialog "保存しました。" return



Crystal

リンク

2022/1/13(Thu) 16:46:54|NO.95005

ありがとうございます。無事できました。何度もお聞きしてしまいすみませんでした。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.94980への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2021(c) All rights reserved.