|
|
2022/1/12(Wed) 14:11:08|NO.94980
Minecraftのサーバーにある server.properties を読み込んで、簡単に編集できるようにするアプリを作っているのですが、どのようにすればいいかわかりません。
というのも、server.propertiesの内容が、
gamemode=survival
maxplayers=20
etc...
のように、=の後に、設定する値が来ており、これを正確に読み込みたいと考えています。 ini読み書きモジュールを調べてみたのですが、それだと、ini特有の最初に、
[settings]
....= .....
のように、[settings]の部分が必要になってしまい、これではサーバーの方でエラーが出てしまいます。
どうすれば、gamemode=以下の部分を読み込んで、値代入→保存の形にできるでしょうか?
説明がわかりにくくて申し訳ありません。教えていただけると幸いです。
(事前に調べたりはしていますが、検索ワードによってヒットするものとそうではないものがあり、見逃している可能性もありますが教えていただけると幸いです)
|
|
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
| |
|
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
| |
|
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
| |
|
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
| |
|
2022/1/13(Thu) 16:46:54|NO.95005
ありがとうございます。無事できました。何度もお聞きしてしまいすみませんでした。
|
|