Initial commit

This commit is contained in:
bucket
2026-03-06 23:35:19 +01:00
commit 719d1628e0
46 changed files with 1581 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
root = true
[*]
charset = utf-8
+2
View File
@@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf
+3
View File
@@ -0,0 +1,3 @@
# Godot 4+ specific ignores
.godot/
/android/
+6
View File
@@ -0,0 +1,6 @@
class_name altshowcase extends Control
@export var name_label: Label
@export var uid_label: Label
@export var count_label: Label
@export var search_alts_button: Button
+1
View File
@@ -0,0 +1 @@
uid://2f384phq5272
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c7r26dxgqkklc"
path="res://.godot/imported/Minus.png-fdca73571ee1f51129171a53d22c475c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Minus.png"
dest_files=["res://.godot/imported/Minus.png-fdca73571ee1f51129171a53d22c475c.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 409 B

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dppihj7ptidog"
path="res://.godot/imported/Plus.png-7f0b6e62ef4c9053e1aaeef8ad93a0d8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Plus.png"
dest_files=["res://.godot/imported/Plus.png-7f0b6e62ef4c9053e1aaeef8ad93a0d8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
+10
View File
@@ -0,0 +1,10 @@
class_name Punishment extends Resource
@export var username:String = ""
@export var uid:String = ""
@export var what_punishment:punishment_types
@export var punish_reason:String = ""
## in unix time, zero means forever
@export var punish_end:int
enum punishment_types{BAN,MUTE}
+1
View File
@@ -0,0 +1 @@
uid://cafyno407e2uq
+32
View File
@@ -0,0 +1,32 @@
class_name BanListExporter extends Node
func Export(Punishments:Array[Punishment],file:String) -> void:
var fileaccess:FileAccess = FileAccess.open(file,FileAccess.WRITE)
if !fileaccess:
push_error("!fileaccess is true")
return
var content:String = ""
for punishment in Punishments:
if !punishment.username:
continue
content += "NAME: " + punishment.username + "\n"
content += "UID: " + punishment.uid + "\n"
content += "PUNISHMENT: " + ("MUTE" if punishment.what_punishment ==
punishment.punishment_types.MUTE else "BAN") + "\n"
content += "REASON: " + punishment.punish_reason + "\n"
content += "END_DATE: " + str(punishment.punish_end) + "\n"
fileaccess.store_string(content)
func Exportv1(Punishments:Array[Punishment],file:String) -> void:
var fileaccess:FileAccess = FileAccess.open(file,FileAccess.WRITE)
if !fileaccess:
push_error("!fileaccess is true")
return
var content:String = ""
for punishment in Punishments:
if !punishment.username:
continue
content += "NAME: " + punishment.username + "\n"
content += "UID: " + punishment.uid + "\n"
fileaccess.store_string(content)
+1
View File
@@ -0,0 +1 @@
uid://caaljvxo8tja5
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cinbmowbp2btd"
path="res://.godot/imported/door.png-4ad4ab0c545155655bbef277d86eb152.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://door.png"
dest_files=["res://.godot/imported/door.png-4ad4ab0c545155655bbef277d86eb152.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
+74
View File
@@ -0,0 +1,74 @@
[preset.0]
name="Windows Desktop"
platform="Windows Desktop"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../BanBanWindows/BanListEditor.exe"
patches=PackedStringArray()
patch_delta_encoding=false
patch_delta_compression_level_zstd=19
patch_delta_min_reduction=0.1
patch_delta_include_filters="*"
patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.0.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=true
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
shader_baker/enabled=false
binary_format/architecture="x86_64"
codesign/enable=false
codesign/timestamp=true
codesign/timestamp_server_url=""
codesign/digest_algorithm=1
codesign/description=""
codesign/custom_options=PackedStringArray()
application/modify_resources=true
application/icon=""
application/console_wrapper_icon=""
application/icon_interpolation=4
application/file_version=""
application/product_version=""
application/company_name=""
application/product_name=""
application/file_description=""
application/copyright=""
application/trademarks=""
application/export_angle=0
application/export_d3d12=0
application/d3d12_agility_sdk_multiarch=true
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
$trigger = New-ScheduledTaskTrigger -Once -At 00:00
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
Start-ScheduledTask -TaskName godot_remote_debug
while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'"
dotnet/include_scripts_content=false
dotnet/include_debug_symbols=true
dotnet/embed_build_outputs=false
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><rect width="124" height="124" x="2" y="2" fill="#363d52" stroke="#212532" stroke-width="4" rx="14"/><g fill="#fff" transform="translate(12.322 12.322)scale(.101)"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042" transform="translate(12.322 12.322)scale(.101)"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></svg>

After

Width:  |  Height:  |  Size: 995 B

+43
View File
@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bf1hiirahdgrf"
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.svg"
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
+182
View File
@@ -0,0 +1,182 @@
class_name mainNode extends Control
@export var edit_window:EditWindow
@export var punish_list_parser: PunishListParser
@export var PunishContainer:Control
@export var punish_scene:PackedScene
@export var new_punish_btn:Button
@export var file_opener:FileDialog
@export var open_btn:Button
@export var new_btn:Button
@export var save_btn:Button
@export var exporter:BanListExporter
@export var file_label:Label
@export var save_file_parser:SaveFileParser
@export var quit_confirmation:ConfirmationDialog
@export var ban_counter: Label
@export var save_label: Label
@export var plus: CPUParticles2D
@export var minus: CPUParticles2D
@export var more_btn: Button
@export var options_window: MoreOptionsWindow
var current_path:String
var unsaved:bool
func _ready() -> void:
more_btn.pressed.connect(options_window.show)
edit_window.changed.connect(update_ban_counter) # use as update
quit_confirmation.canceled.connect(get_tree().quit)
quit_confirmation.confirmed.connect(save_and_exit)
get_tree().auto_accept_quit = false
get_tree().root.close_requested.connect(close_request)
set_file(save_file_parser.read())
file_opener.file_selected.connect(set_file)
open_btn.pressed.connect(file_opener.show)
new_btn.pressed.connect(new_punishment)
save_btn.pressed.connect(save)
options_window.remove_dupes.connect(remove_dupes)
options_window.save_v_one.connect(savevone)
func savevone():
var Punishments:Array[Punishment]
for child in PunishContainer.get_children():
if child is PunishShowcase:
Punishments.append(child.punishment)
exporter.Exportv1(Punishments,current_path.rstrip(".txt")+" v1.txt")
func _process(_delta: float) -> void:
if Input.is_action_just_pressed("save"):
save()
var last_alts:int = 0
func remove_dupes():
unsaved = true
remove_loop()
update_ban_counter()
func remove_loop():
var found:bool = remove_iteration()
if found == true:
remove_loop()
func remove_iteration() -> bool:
var punishments:Array[PunishShowcase]
for child in PunishContainer.get_children():
if child is PunishShowcase:
punishments.append(child)
for punishment_keep in punishments:
for punishment_two in punishments:
# cancel if not same name
if punishment_keep == punishment_two:
continue
if punishment_keep.punishment.username != punishment_two.punishment.username:
continue
# cancel if not same uid
if punishment_keep.punishment.uid != punishment_two.punishment.uid:
continue
# if there a reason?
if punishment_keep.punishment.punish_reason == "":
punishment_keep.punishment.punish_reason = punishment_two.punishment.punish_reason
# is there a time set?
if punishment_keep.punishment.punish_end == 0:
punishment_keep.punishment.punish_end = punishment_two.punishment.punish_end
# if its a mute maybe it should be a ban
if punishment_keep.punishment.what_punishment == Punishment.punishment_types.MUTE:
punishment_keep.punishment.what_punishment = punishment_two.punishment.what_punishment
punishment_two.free()
return true
return false
func update_ban_counter():
var punishments:Array[Punishment]
for child in PunishContainer.get_children():
if child is PunishShowcase:
punishments.append(child.punishment)
var count:int = 0
var keys:Array[String]
for punishment in punishments:
if punishment.uid != "":
if !keys.has(punishment.uid):
keys.append(punishment.uid)
count += 1
else:
if !keys.has(punishment.username):
keys.append(punishment.username)
count += 1
ban_counter.text = str(punishments.size()) + " Entires :::::: " + str(count) + \
" Unique :::::: " + str(punishments.size()-count) + " Alts"
var alts = punishments.size() - count
if last_alts != alts:
if alts > last_alts:
plus.emitting = true
else:
minus.emitting = true
last_alts = alts
func save():
save_label.hide()
var Punishments:Array[Punishment]
for child in PunishContainer.get_children():
if child is PunishShowcase:
Punishments.append(child.punishment)
update_ban_counter()
save_file_parser.save(current_path)
exporter.Export(Punishments,current_path)
unsaved = false
func new_punishment() -> void:
unsaved = true
save_label.show()
var child:PunishShowcase = punish_scene.instantiate()
child.punishment = Punishment.new()
PunishContainer.add_child(child)
child.update()
child.Edit.connect(edit_called)
edit_called(child,true)
update_ban_counter()
func add_punishments(file:String):
save_label.show()
var punishments = punish_list_parser.parse(file)
for punish:Punishment in punishments:
var child:PunishShowcase = punish_scene.instantiate()
child.punishment = punish
PunishContainer.add_child(child)
child.update()
child.Edit.connect(edit_called)
update_ban_counter()
func clear_children():
save_label.hide()
for child in PunishContainer.get_children():
child.queue_free()
update_ban_counter()
func edit_called(on:PunishShowcase,set_time:bool = false):
save_label.show()
unsaved = true
edit_window.opened_from = on
edit_window.punishment = on.punishment if on else Punishment.new()
edit_window.update(set_time)
edit_window.show()
edit_window.grab_focus()
update_ban_counter()
func set_file(path:String):
current_path = path
file_label.text = path
clear_children()
add_punishments(path)
func close_request():
if !unsaved:
get_tree().quit()
else:
quit_confirmation.show()
func save_and_exit():
save()
get_tree().quit()
+1
View File
@@ -0,0 +1 @@
uid://c57yqopmolu8o
+34
View File
@@ -0,0 +1,34 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=5
[application]
config/name="BanListEditor"
run/main_scene="uid://cxf3yenlgvupj"
config/features=PackedStringArray("4.7", "GL Compatibility")
config/icon="res://icon.svg"
[dotnet]
project/assembly_name="BanListEditor"
[input]
save={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
]
}
[rendering]
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"
textures/vram_compression/import_etc2_astc=true
+44
View File
@@ -0,0 +1,44 @@
class_name PunishListParser extends Node
func parse(file:String) -> Array[Punishment]:
if !file:
return []
var fileaccess:FileAccess = FileAccess.open(file,FileAccess.READ)
if fileaccess == null:
printerr("no access to file: fileaccess == null")
return []
var raw:String = fileaccess.get_as_text()
var lines:PackedStringArray = raw.split("\n")
var punishments:Array[Punishment]
for line in lines:
print("line ",line)
var splits:PackedStringArray = line.split(": ")
match splits[0]:
"L!ListBegin":
print("start")
"NAME":
var new_punish:Punishment = Punishment.new()
new_punish.username = splits[1]
punishments.append(new_punish)
"UID":
punishments[-1].uid = splits[1]
"PUNISHMENT":
var punish:Punishment.punishment_types = punish_text_to_enum(splits[1])
punishments[-1].what_punishment = punish
"REASON":
punishments[-1].punish_reason = splits[1]
"END_DATE":
punishments[-1].punish_end = splits[1].to_int()
"L!ListEnd":
break
return punishments
func punish_text_to_enum(text) -> Punishment.punishment_types:
var punish:Punishment.punishment_types
match text:
"BAN":
punish = Punishment.punishment_types.BAN
"MUTE":
punish = Punishment.punishment_types.MUTE
return punish
+1
View File
@@ -0,0 +1 @@
uid://c5ihhdkosauvw
+18
View File
@@ -0,0 +1,18 @@
class_name SaveFileParser extends Node
const savloc = "user://save.dat"
func read() -> String:
var file = FileAccess.open(savloc,FileAccess.READ)
if !file:
print("no savefile found")
return ""
return file.get_as_text()
func save(current_file:String) -> void:
var file = FileAccess.open(savloc,FileAccess.WRITE)
if !file:
push_error("cant write savefile")
return
file.store_string(current_file)
+1
View File
@@ -0,0 +1 @@
uid://3gmapu83dglo
+244
View File
@@ -0,0 +1,244 @@
[gd_scene format=3 uid="uid://cxf3yenlgvupj"]
[ext_resource type="Script" uid="uid://c57yqopmolu8o" path="res://main.gd" id="1_bjd11"]
[ext_resource type="PackedScene" uid="uid://bxpr2nb1hydpi" path="res://scenes/punish_showcase.tscn" id="2_qmy6f"]
[ext_resource type="Texture2D" uid="uid://o2sjogt3b0ht" path="res://tf2logo.png" id="3_mwfav"]
[ext_resource type="Texture2D" uid="uid://dppihj7ptidog" path="res://Plus.png" id="4_3p2gp"]
[ext_resource type="Texture2D" uid="uid://c7r26dxgqkklc" path="res://Minus.png" id="5_cvmbd"]
[ext_resource type="Script" uid="uid://c5ihhdkosauvw" path="res://punish_list_parser.gd" id="6_ft6cd"]
[ext_resource type="Script" uid="uid://caaljvxo8tja5" path="res://ban_list_exporter.gd" id="7_bb450"]
[ext_resource type="PackedScene" uid="uid://dy18m2uq557to" path="res://scenes/windwos/edit_window.tscn" id="8_nfivy"]
[ext_resource type="PackedScene" uid="uid://burukk5374yyu" path="res://scenes/windwos/MoreOptionsWindow.tscn" id="9_1nqs0"]
[ext_resource type="PackedScene" uid="uid://gah2g6nabyf4" path="res://scenes/windwos/statistics.tscn" id="10_1iba3"]
[ext_resource type="Script" uid="uid://bt5wd8qjaevk0" path="res://search.gd" id="11_yxlcp"]
[ext_resource type="Script" uid="uid://3gmapu83dglo" path="res://save_file_parser.gd" id="12_ebg2g"]
[sub_resource type="LabelSettings" id="LabelSettings_lgr22"]
font_size = 26
outline_size = 11
outline_color = Color(0, 0, 0, 1)
shadow_size = 11
shadow_color = Color(0, 0, 0, 0.3254902)
shadow_offset = Vector2(12.105, 8.315)
stacked_outline_count = 3
stacked_outline_0/size = 4
stacked_outline_0/color = Color(1, 0, 0, 1)
stacked_outline_1/size = 4
stacked_outline_1/color = Color(0.8099345, 0.9946762, 7.70092e-07, 1)
stacked_outline_2/size = 4
stacked_outline_2/color = Color(0.32855865, 0.41260794, 1, 1)
[node name="Control" type="Control" unique_id=2276929 node_paths=PackedStringArray("edit_window", "punish_list_parser", "PunishContainer", "new_punish_btn", "file_opener", "open_btn", "new_btn", "save_btn", "exporter", "file_label", "save_file_parser", "quit_confirmation", "ban_counter", "save_label", "plus", "minus", "more_btn", "options_window")]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_bjd11")
edit_window = NodePath("EditWindow")
punish_list_parser = NodePath("BanListParser")
PunishContainer = NodePath("MarginContainer/VBoxContainer/ScrollContainer/Tree")
punish_scene = ExtResource("2_qmy6f")
new_punish_btn = NodePath("MarginContainer/VBoxContainer/HBoxContainer/Punish")
file_opener = NodePath("OpenFile")
open_btn = NodePath("MarginContainer/VBoxContainer/HBoxContainer2/OpenFileBtn")
new_btn = NodePath("MarginContainer/VBoxContainer/HBoxContainer/Punish")
save_btn = NodePath("MarginContainer/VBoxContainer/HBoxContainer2/SaveBtn")
exporter = NodePath("BanListExporter")
file_label = NodePath("MarginContainer/VBoxContainer/HBoxContainer2/CurrentFile")
save_file_parser = NodePath("SaveFileParser")
quit_confirmation = NodePath("ConfirmationDialog")
ban_counter = NodePath("MarginContainer/VBoxContainer/HBoxContainer/BanCounter")
save_label = NodePath("MarginContainer/VBoxContainer/HBoxContainer2/SaveLabel")
plus = NodePath("MarginContainer/VBoxContainer/HBoxContainer/BanCounter/Plus")
minus = NodePath("MarginContainer/VBoxContainer/HBoxContainer/BanCounter/Minus")
more_btn = NodePath("MarginContainer/VBoxContainer/HBoxContainer/More")
options_window = NodePath("OptionsWindow")
[node name="TextureRect" type="TextureRect" parent="." unique_id=1516457942]
modulate = Color(0.74558026, 0.7455802, 0.7455802, 1)
z_index = -1
layout_mode = 1
anchors_preset = -1
offset_left = -119.0
offset_top = -214.0
offset_right = 405.0
offset_bottom = 526.0
texture = ExtResource("3_mwfav")
expand_mode = 5
stretch_mode = 5
[node name="ColorRect" type="ColorRect" parent="." unique_id=1789999219]
z_index = -2
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0.32993424, 0.25434008, 0.17645565, 1)
[node name="MarginContainer" type="MarginContainer" parent="." unique_id=1863119132]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/margin_left = 5
theme_override_constants/margin_top = 5
theme_override_constants/margin_right = 5
theme_override_constants/margin_bottom = 5
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer" unique_id=1186401858]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="HBoxContainer" type="FlowContainer" parent="MarginContainer/VBoxContainer" unique_id=550324332]
layout_mode = 2
[node name="Label" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=388690639]
layout_mode = 2
size_flags_horizontal = 3
text = "TFVR punishlist maker 2000™"
label_settings = SubResource("LabelSettings_lgr22")
[node name="BanCounter" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=589605427]
layout_mode = 2
text = "Unique Bans: "
[node name="Plus" type="CPUParticles2D" parent="MarginContainer/VBoxContainer/HBoxContainer/BanCounter" unique_id=93983186]
position = Vector2(76, 8)
emitting = false
texture = ExtResource("4_3p2gp")
lifetime = 3.9
one_shot = true
explosiveness = 1.0
emission_shape = 1
emission_sphere_radius = 7.85
spread = 180.0
initial_velocity_min = 0.8
initial_velocity_max = 74.87
[node name="Minus" type="CPUParticles2D" parent="MarginContainer/VBoxContainer/HBoxContainer/BanCounter" unique_id=2092945034]
position = Vector2(76, 8)
emitting = false
amount = 3
texture = ExtResource("5_cvmbd")
lifetime = 3.9
one_shot = true
explosiveness = 1.0
emission_shape = 1
emission_sphere_radius = 7.85
spread = 180.0
initial_velocity_min = 0.8
initial_velocity_max = 74.87
[node name="Punish" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=100050923]
layout_mode = 2
size_flags_horizontal = 8
text = "new punishment"
[node name="Stats" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=1256562107]
layout_mode = 2
size_flags_horizontal = 8
text = "Stats"
[node name="More" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=804757173]
layout_mode = 2
size_flags_horizontal = 8
text = "More"
[node name="SearchBar" type="LineEdit" parent="MarginContainer/VBoxContainer" unique_id=2022677611]
layout_mode = 2
placeholder_text = "Search..."
[node name="HSeparator" type="HSeparator" parent="MarginContainer/VBoxContainer" unique_id=1970903622]
layout_mode = 2
[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer" unique_id=1423908622]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Tree" type="VBoxContainer" parent="MarginContainer/VBoxContainer/ScrollContainer" unique_id=200799914]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="HSeparator2" type="HSeparator" parent="MarginContainer/VBoxContainer" unique_id=1677426181]
layout_mode = 2
[node name="HBoxContainer2" type="FlowContainer" parent="MarginContainer/VBoxContainer" unique_id=1760266968]
layout_mode = 2
alignment = 2
last_wrap_alignment = 2
[node name="OpenFileBtn" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1707347790]
layout_mode = 2
text = "Open file"
[node name="CurrentFile" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1158273656]
layout_mode = 2
size_flags_horizontal = 3
text = "no file selected"
clip_text = true
text_overrun_behavior = 1
[node name="SaveLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1042352785]
visible = false
layout_mode = 2
text = "*"
[node name="SaveBtn" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1041770707]
layout_mode = 2
text = "Save changes"
[node name="BanListParser" type="Node" parent="." unique_id=951623750]
script = ExtResource("6_ft6cd")
[node name="BanListExporter" type="Node" parent="." unique_id=1531169139]
script = ExtResource("7_bb450")
[node name="EditWindow" parent="." unique_id=211137631 instance=ExtResource("8_nfivy")]
[node name="OptionsWindow" parent="." unique_id=1485451151 instance=ExtResource("9_1nqs0")]
initial_position = 4
[node name="Statistics" parent="." unique_id=1932979201 node_paths=PackedStringArray("root", "PunishContainer", "search_bar") instance=ExtResource("10_1iba3")]
root = NodePath("..")
PunishContainer = NodePath("../MarginContainer/VBoxContainer/ScrollContainer/Tree")
search_bar = NodePath("../MarginContainer/VBoxContainer/SearchBar")
[node name="Search" type="Node" parent="." unique_id=170590161 node_paths=PackedStringArray("search_bar", "punish_container")]
script = ExtResource("11_yxlcp")
search_bar = NodePath("../MarginContainer/VBoxContainer/SearchBar")
punish_container = NodePath("../MarginContainer/VBoxContainer/ScrollContainer/Tree")
[node name="OpenFile" type="FileDialog" parent="." unique_id=1378168421]
oversampling_override = 1.0
title = "Open a File"
size = Vector2i(807, 360)
file_mode = 0
access = 2
filters = PackedStringArray("*.txt", "*.dat")
use_native_dialog = true
[node name="SaveFileParser" type="Node" parent="." unique_id=930223611]
script = ExtResource("12_ebg2g")
[node name="ConfirmationDialog" type="ConfirmationDialog" parent="." unique_id=416398003]
oversampling_override = 1.0
initial_position = 4
size = Vector2i(305, 100)
always_on_top = true
force_native = true
ok_button_text = "Save and quit"
dialog_text = "You have unsaved changes!"
cancel_button_text = "Quit without saving"
[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/Stats" to="Statistics" method="grab_focus"]
[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/Stats" to="Statistics" method="show"]
[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/More" to="OptionsWindow" method="grab_focus"]
+26
View File
@@ -0,0 +1,26 @@
class_name PunishShowcase extends Control
@onready var name_label: Label = $Container/VBoxContainer/Name
@onready var uid_label: Label = $Container/VBoxContainer/UID
@onready var edit_button: Button = $Container/Edit
@onready var punishment_type_display: TextureRect = $Container/PunishmentTypeDisplay
@onready var container: FlowContainer = $Container
@export var punishment:Punishment
signal Edit(showcase:PunishShowcase)
func _ready() -> void:
edit_button.pressed.connect(edit)
if !punishment:
punishment = Punishment.new()
func update() -> void:
name_label.text = punishment.username
uid_label.text = punishment.uid
punishment_type_display.texture = load("res://door.png") if \
punishment.what_punishment == punishment.punishment_types.BAN else load("res://speaker.png")
func edit():
Edit.emit(self)
func _process(delta: float) -> void:
custom_minimum_size.y = container.size.y
+1
View File
@@ -0,0 +1 @@
uid://dxlkscqs0wpo6
+71
View File
@@ -0,0 +1,71 @@
[gd_scene format=3 uid="uid://bxpr2nb1hydpi"]
[ext_resource type="Script" uid="uid://dxlkscqs0wpo6" path="res://scenes/punish_showcase.gd" id="1_3wpqj"]
[ext_resource type="Script" uid="uid://cafyno407e2uq" path="res://Punishment.gd" id="2_j4kex"]
[ext_resource type="Texture2D" uid="uid://cinbmowbp2btd" path="res://door.png" id="3_lw8i6"]
[sub_resource type="Resource" id="Resource_j4kex"]
script = ExtResource("2_j4kex")
metadata/_custom_type_script = "uid://cafyno407e2uq"
[sub_resource type="LabelSettings" id="LabelSettings_lw8i6"]
font_size = 20
outline_color = Color(0, 0, 0, 1)
shadow_size = 8
shadow_color = Color(0, 0, 0, 0.54509807)
shadow_offset = Vector2(1.31, 1.925)
[sub_resource type="LabelSettings" id="LabelSettings_j4kex"]
font_color = Color(0.68307734, 0.6830774, 0.68307734, 1)
[node name="PunishShowcase" type="Control" unique_id=1878310580]
custom_minimum_size = Vector2(0, 59)
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_right = -717.0
offset_bottom = -589.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_3wpqj")
punishment = SubResource("Resource_j4kex")
[node name="ColorRect" type="ColorRect" parent="." unique_id=1592063175]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0.2509804, 0.2509804, 0.2509804, 0.4862745)
[node name="Container" type="FlowContainer" parent="." unique_id=818336029]
layout_mode = 1
anchors_preset = -1
anchor_right = 1.0
offset_bottom = 55.0
grow_horizontal = 2
[node name="VBoxContainer" type="VBoxContainer" parent="Container" unique_id=2062889465]
layout_mode = 2
size_flags_horizontal = 3
[node name="Name" type="Label" parent="Container/VBoxContainer" unique_id=1768649764]
layout_mode = 2
text = "NAME"
label_settings = SubResource("LabelSettings_lw8i6")
[node name="UID" type="Label" parent="Container/VBoxContainer" unique_id=323779410]
layout_mode = 2
text = "UID"
label_settings = SubResource("LabelSettings_j4kex")
[node name="PunishmentTypeDisplay" type="TextureRect" parent="Container" unique_id=1037680772]
layout_mode = 2
texture = ExtResource("3_lw8i6")
expand_mode = 2
[node name="Edit" type="Button" parent="Container" unique_id=31447788]
layout_mode = 2
text = "More / Edit"
+66
View File
@@ -0,0 +1,66 @@
[gd_scene format=3 uid="uid://burukk5374yyu"]
[ext_resource type="Script" uid="uid://cgr5yq35l0u65" path="res://scenes/windwos/more_options_window.gd" id="1_5xt3b"]
[sub_resource type="LabelSettings" id="LabelSettings_5xt3b"]
font_size = 30
[node name="OptionsWindow" type="Window" unique_id=1485451151 node_paths=PackedStringArray("dupe_clear_button", "save_v_1_button")]
oversampling_override = 1.0
position = Vector2i(0, 36)
size = Vector2i(300, 200)
visible = false
force_native = true
min_size = Vector2i(262, 199)
script = ExtResource("1_5xt3b")
dupe_clear_button = NodePath("MarginContainer/ScrollContainer/BoxContainer/DupeClearButton")
save_v_1_button = NodePath("MarginContainer/ScrollContainer/BoxContainer/SaveV1Button")
[node name="ColorRect" type="ColorRect" parent="." unique_id=1724009282]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
color = Color(0.32941177, 0.25490198, 0.1764706, 1)
[node name="MarginContainer" type="MarginContainer" parent="." unique_id=782458598]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_constants/margin_left = 5
theme_override_constants/margin_top = 5
theme_override_constants/margin_right = 5
theme_override_constants/margin_bottom = 5
[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer" unique_id=1444604018]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
horizontal_scroll_mode = 0
[node name="BoxContainer" type="BoxContainer" parent="MarginContainer/ScrollContainer" unique_id=1819150398]
layout_mode = 2
size_flags_horizontal = 3
vertical = true
[node name="RichTextLabel" type="Label" parent="MarginContainer/ScrollContainer/BoxContainer" unique_id=66906023]
layout_mode = 2
text = "Utility"
label_settings = SubResource("LabelSettings_5xt3b")
[node name="DupeClearButton" type="Button" parent="MarginContainer/ScrollContainer/BoxContainer" unique_id=25275652]
layout_mode = 2
tooltip_text = "Removes duplicate entires(same uid and name)"
text = "Clear Dupes"
[node name="SaveV1Button" type="Button" parent="MarginContainer/ScrollContainer/BoxContainer" unique_id=1718864258]
layout_mode = 2
tooltip_text = "Save a version of the banlist in the legacy format"
text = "save duplicate v1 file"
+89
View File
@@ -0,0 +1,89 @@
extends Window
@export var root:mainNode
@export var PunishContainer:Control
@export var search_bar:LineEdit
@export var total: Label
@export var alts: Label
@export var unique: Label
@export var best: Label
@export var altshowcse: PackedScene
@export var altshowcse_container: Control
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
visibility_changed.connect(update_stats)
update_stats()
close_requested.connect(hide)
root.edit_window.changed.connect(update_stats)
func update_stats():
for child in altshowcse_container.get_children():
child.queue_free()
var punishments:Array[Punishment]
for child in PunishContainer.get_children():
if child is PunishShowcase:
punishments.append(child.punishment)
var count:int = 0
var keys:Array[String]
for punishment in punishments:
if punishment.uid != "":
if !keys.has(punishment.uid):
keys.append(punishment.uid)
count += 1
else:
if !keys.has(punishment.username):
keys.append(punishment.username)
count += 1
var entires_stats:Dictionary[Punishment,int]
for punishment in punishments:
if punishment.uid:
for punishment2 in punishments:
if punishment2 != punishment:
if punishment2.uid == punishment.uid:
if entires_stats.has(punishment):
entires_stats[punishment] += 1
else:
entires_stats[punishment] = 1
var most_evader:Punishment
var most_alts:int = -1
var used_uids:Array[String] = []
sort_dict(entires_stats)
for entry in entires_stats.keys():
if entires_stats[entry] > most_alts:
print("new best: ",entires_stats[entry] )
most_evader = entry
most_alts = entires_stats[entry]
if entry is Punishment:
if entry.uid not in used_uids:
used_uids.append(entry.uid)
var child:altshowcase = altshowcse.instantiate()
altshowcse_container.add_child(child)
child.count_label.text = "%s alts" % entires_stats[entry]
child.name_label.text = entry.username
child.uid_label.text = entry.uid
child.search_alts_button.pressed.connect(root_search.bind(child.uid_label.text))
total.text = "Total punishments %s" % str(punishments.size())
unique.text = "Unique people: %s" % str(count)
alts.text = "Alts total: %s" % str(punishments.size()-count)
if most_evader:
best.text = "Most alt accounts: %s (%s)" % [most_evader.username, most_evader.uid]
func root_search(what:String):
search_bar.text = what
search_bar.text_changed.emit(what)
func sort_dict(dict: Dictionary) -> void:
var pairs = dict.keys().map(func (key): return [key, dict[key]])
pairs.sort()
pairs.reverse()
dict.clear()
for p in pairs:
dict[p[0]] = p[1]
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
+1
View File
@@ -0,0 +1 @@
uid://dwc8m0l6he4uo
+62
View File
@@ -0,0 +1,62 @@
[gd_scene format=3 uid="uid://bv4mvou68l2sk"]
[ext_resource type="Script" uid="uid://2f384phq5272" path="res://AltShowcase.gd" id="1_7tuyd"]
[sub_resource type="LabelSettings" id="LabelSettings_7tuyd"]
font_size = 20
[sub_resource type="LabelSettings" id="LabelSettings_45q1g"]
font_size = 15
font_color = Color(0.74558026, 0.7455802, 0.7455802, 1)
[sub_resource type="LabelSettings" id="LabelSettings_y1bem"]
font_size = 27
[node name="Altshowcase" type="Control" unique_id=96967418 node_paths=PackedStringArray("name_label", "uid_label", "count_label", "search_alts_button")]
custom_minimum_size = Vector2(0, 58.235)
layout_mode = 3
anchors_preset = 10
anchor_right = 1.0
grow_horizontal = 2
size_flags_horizontal = 3
script = ExtResource("1_7tuyd")
name_label = NodePath("HBoxContainer/VBoxContainer/Name")
uid_label = NodePath("HBoxContainer/VBoxContainer/Uid")
count_label = NodePath("HBoxContainer/Count")
search_alts_button = NodePath("HBoxContainer/SearchAltsButton")
[node name="ColorRect" type="ColorRect" parent="." unique_id=2074909687]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 0.13333334)
[node name="HBoxContainer" type="HBoxContainer" parent="." unique_id=809192798]
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer" unique_id=166743843]
layout_mode = 2
[node name="Name" type="Label" parent="HBoxContainer/VBoxContainer" unique_id=1070838197]
layout_mode = 2
text = "name"
label_settings = SubResource("LabelSettings_7tuyd")
[node name="Uid" type="Label" parent="HBoxContainer/VBoxContainer" unique_id=718203878]
layout_mode = 2
text = "UID"
label_settings = SubResource("LabelSettings_45q1g")
[node name="Count" type="Label" parent="HBoxContainer" unique_id=899914138]
layout_mode = 2
text = "67 alts"
label_settings = SubResource("LabelSettings_y1bem")
[node name="SearchAltsButton" type="Button" parent="HBoxContainer" unique_id=957758160]
layout_mode = 2
text = "Show"
+86
View File
@@ -0,0 +1,86 @@
class_name EditWindow extends Window
@onready var days_edit: SpinBox = $margin/VBoxContainer/ScrollContainer/Container/Ends/DaysEdit
@onready var years_edit: SpinBox = $margin/VBoxContainer/ScrollContainer/Container/Ends/YearsEdit
@onready var reason_edit: LineEdit = $"margin/VBoxContainer/ScrollContainer/Container/Reason/Reason Edit"
@onready var uid_edit: LineEdit = $"margin/VBoxContainer/ScrollContainer/Container/UID/UID Edit"
@onready var name_edit: LineEdit = $"margin/VBoxContainer/ScrollContainer/Container/Name/Name Edit"
@onready var donebutton: Button = $margin/VBoxContainer/Done
@onready var delete_check: CheckBox = $margin/VBoxContainer/ScrollContainer/Container/DeleteCheck
@onready var delete_button: Button = $margin/VBoxContainer/ScrollContainer/Container/DeleteButton
@onready var type_button: OptionButton = $margin/VBoxContainer/ScrollContainer/Container/Type/TypeButton
@export var opened_from:PunishShowcase
@export var punishment:Punishment
const id_to_name:Dictionary = {Punishment.punishment_types.BAN:"BAN",
Punishment.punishment_types.MUTE:"MUTE"}
signal changed
func _ready() -> void:
close_requested.connect(close)
donebutton.pressed.connect(done)
delete_button.pressed.connect(delete_this)
for type in Punishment.punishment_types:
type_button.add_item(type)
func delete_this():
if opened_from:
opened_from.queue_free()
punishment = null
hide()
delete_check.button_pressed = false
changed.emit()
func _process(delta: float) -> void:
delete_button.disabled = !delete_check.button_pressed
func update(set_time:bool = false):
if !punishment:
printerr("!punishment is true")
return
name_edit.text = punishment.username
uid_edit.text = punishment.uid
reason_edit.text = punishment.punish_reason
var from_time:int = punishment.punish_end
var from_unix:Dictionary = Time.get_date_dict_from_unix_time(from_time)
@warning_ignore("integer_division")
var years:int = from_unix["year"]
@warning_ignore("integer_division")
var days:int = from_unix["day"]
years_edit.value = years
days_edit.value = days
type_button.select(punishment.what_punishment)
changed.emit()
func close():
punishment = null
opened_from = null
delete_check.button_pressed = false
hide()
changed.emit()
func done():
if opened_from:
opened_from.punishment = get_punish()
opened_from.update()
hide()
else:
hide()
delete_check.button_pressed = false
changed.emit()
func get_punish() -> Punishment:
var new_punishment:Punishment = Punishment.new()
new_punishment.username = name_edit.text
new_punishment.uid = uid_edit.text
new_punishment.punish_reason = reason_edit.text
var time:int = 0
time += years_edit.value * 31536000
time += days_edit.value *86400
var unixtime:float = Time.get_unix_time_from_datetime_dict({"year":years_edit.value,
"day":days_edit.value,})
new_punishment.punish_end = unixtime
new_punishment.what_punishment = type_button.selected
changed.emit()
return new_punishment
+1
View File
@@ -0,0 +1 @@
uid://n41mlonj47n3
+143
View File
@@ -0,0 +1,143 @@
[gd_scene format=3 uid="uid://dy18m2uq557to"]
[ext_resource type="Script" uid="uid://n41mlonj47n3" path="res://scenes/windwos/edit_window.gd" id="1_827p1"]
[sub_resource type="LabelSettings" id="LabelSettings_827p1"]
font_size = 14
font_color = Color(0.7581918, 0.7581918, 0.7581917, 1)
[node name="EditWindow" type="Window" unique_id=1215629639]
oversampling_override = 1.0
initial_position = 4
size = Vector2i(680, 395)
visible = false
force_native = true
script = ExtResource("1_827p1")
[node name="ColorRect" type="ColorRect" parent="." unique_id=207830370]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0.32941177, 0.25490198, 0.1764706, 1)
[node name="margin" type="MarginContainer" parent="." unique_id=81777967]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_constants/margin_left = 5
theme_override_constants/margin_top = 5
theme_override_constants/margin_right = 5
theme_override_constants/margin_bottom = 5
[node name="VBoxContainer" type="VBoxContainer" parent="margin" unique_id=565613909]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Label" type="Label" parent="margin/VBoxContainer" unique_id=725988158]
layout_mode = 2
size_flags_horizontal = 3
text = "Edit Punishment"
[node name="HSeparator" type="HSeparator" parent="margin/VBoxContainer" unique_id=155976402]
layout_mode = 2
[node name="ScrollContainer" type="ScrollContainer" parent="margin/VBoxContainer" unique_id=7819980]
layout_mode = 2
size_flags_vertical = 3
[node name="Container" type="VBoxContainer" parent="margin/VBoxContainer/ScrollContainer" unique_id=505332829]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Name" type="HBoxContainer" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=2031494707]
layout_mode = 2
[node name="Name Label" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container/Name" unique_id=579407327]
layout_mode = 2
text = "Name:"
[node name="Name Edit" type="LineEdit" parent="margin/VBoxContainer/ScrollContainer/Container/Name" unique_id=716298584]
layout_mode = 2
size_flags_horizontal = 3
[node name="UID" type="HBoxContainer" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=211366043]
layout_mode = 2
[node name="UID Label" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container/UID" unique_id=1644730935]
layout_mode = 2
text = "UID:"
[node name="UID Edit" type="LineEdit" parent="margin/VBoxContainer/ScrollContainer/Container/UID" unique_id=946656979]
layout_mode = 2
size_flags_horizontal = 3
draw_control_chars = true
[node name="Type" type="HBoxContainer" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=301450437]
layout_mode = 2
[node name="Type" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container/Type" unique_id=10941001]
layout_mode = 2
text = "Type:"
[node name="TypeButton" type="OptionButton" parent="margin/VBoxContainer/ScrollContainer/Container/Type" unique_id=2091379963]
layout_mode = 2
[node name="Reason" type="HBoxContainer" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=420802158]
layout_mode = 2
[node name="Reason Label" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container/Reason" unique_id=675845905]
layout_mode = 2
text = "Reason:"
[node name="Reason Edit" type="LineEdit" parent="margin/VBoxContainer/ScrollContainer/Container/Reason" unique_id=194738986]
layout_mode = 2
size_flags_horizontal = 3
[node name="Ends" type="HBoxContainer" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=594016585]
layout_mode = 2
[node name="Ends Label" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container/Ends" unique_id=1648518427]
layout_mode = 2
text = "Ends on:"
[node name="DaysEdit" type="SpinBox" parent="margin/VBoxContainer/ScrollContainer/Container/Ends" unique_id=1346908939]
layout_mode = 2
size_flags_horizontal = 3
max_value = 364.0
prefix = "day "
[node name="YearsEdit" type="SpinBox" parent="margin/VBoxContainer/ScrollContainer/Container/Ends" unique_id=467960707]
layout_mode = 2
size_flags_horizontal = 3
min_value = 1970.0
max_value = 1000000.0
value = 1970.0
allow_greater = true
prefix = "year"
[node name="Label2" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=9299148]
layout_mode = 2
text = "keep all at 0 for an infinite ban."
label_settings = SubResource("LabelSettings_827p1")
[node name="DeleteCheck" type="CheckBox" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=1640369628]
layout_mode = 2
text = "Do you want to delete this punishment?"
[node name="DeleteButton" type="Button" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=150626956]
layout_mode = 2
size_flags_horizontal = 0
text = "Delete"
alignment = 0
[node name="Done" type="Button" parent="margin/VBoxContainer" unique_id=1829409858]
layout_mode = 2
text = "Done"
+18
View File
@@ -0,0 +1,18 @@
class_name MoreOptionsWindow extends Window
@export var dupe_clear_button: Button
@export var save_v_1_button: Button
signal remove_dupes
signal save_v_one
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
save_v_1_button.pressed.connect(save_v_one.emit)
dupe_clear_button.pressed.connect(remove_dupes.emit)
close_requested.connect(close)
func close():
hide()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
@@ -0,0 +1 @@
uid://cgr5yq35l0u65
+91
View File
@@ -0,0 +1,91 @@
[gd_scene format=3 uid="uid://gah2g6nabyf4"]
[ext_resource type="Script" uid="uid://dwc8m0l6he4uo" path="res://scenes/windwos/StatisticsWindow.gd" id="1_nsh46"]
[ext_resource type="PackedScene" uid="uid://bv4mvou68l2sk" path="res://scenes/windwos/altshowcse.tscn" id="2_5eyo7"]
[node name="Statistics" type="Window" unique_id=1932979201 node_paths=PackedStringArray("total", "alts", "unique", "best", "altshowcse_container")]
oversampling_override = 1.0
initial_position = 4
size = Vector2i(536, 390)
visible = false
force_native = true
script = ExtResource("1_nsh46")
total = NodePath("MarginContainer/TabContainer/Stats/VBoxContainer/Total")
alts = NodePath("MarginContainer/TabContainer/Stats/VBoxContainer/alts")
unique = NodePath("MarginContainer/TabContainer/Stats/VBoxContainer/Unique")
best = NodePath("MarginContainer/TabContainer/Stats/VBoxContainer/best")
altshowcse = ExtResource("2_5eyo7")
altshowcse_container = NodePath("MarginContainer/TabContainer/Leaderboard/ScrollContainer/Container")
[node name="ColorRect" type="ColorRect" parent="." unique_id=121481691]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
color = Color(0.28358635, 0.30315065, 0.06554975, 1)
[node name="MarginContainer" type="MarginContainer" parent="." unique_id=21771767]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_constants/margin_left = 5
theme_override_constants/margin_top = 5
theme_override_constants/margin_right = 5
theme_override_constants/margin_bottom = 5
[node name="TabContainer" type="TabContainer" parent="MarginContainer" unique_id=870918671]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
current_tab = 1
[node name="Stats" type="Control" parent="MarginContainer/TabContainer" unique_id=1161969781]
visible = false
layout_mode = 2
metadata/_tab_index = 0
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/TabContainer/Stats" unique_id=1730227224]
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="Total" type="Label" parent="MarginContainer/TabContainer/Stats/VBoxContainer" unique_id=1786141427]
layout_mode = 2
text = "Total punishments:"
[node name="alts" type="Label" parent="MarginContainer/TabContainer/Stats/VBoxContainer" unique_id=874615516]
layout_mode = 2
text = "thereof alts:"
[node name="Unique" type="Label" parent="MarginContainer/TabContainer/Stats/VBoxContainer" unique_id=44141892]
layout_mode = 2
text = "unique entires:"
[node name="best" type="Label" parent="MarginContainer/TabContainer/Stats/VBoxContainer" unique_id=1010711371]
layout_mode = 2
text = "Best evader(most alts):"
[node name="Leaderboard" type="Control" parent="MarginContainer/TabContainer" unique_id=166474110]
layout_mode = 2
metadata/_tab_index = 1
[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/TabContainer/Leaderboard" unique_id=1207491017]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Container" type="VBoxContainer" parent="MarginContainer/TabContainer/Leaderboard/ScrollContainer" unique_id=1822273302]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
alignment = 2
+20
View File
@@ -0,0 +1,20 @@
extends Node
@export var search_bar:LineEdit
@export var punish_container:Node
func _ready() -> void:
search_bar.text_changed.connect(update)
func update(text:String):
if text:
for child in punish_container.get_children():
if child is PunishShowcase:
if (text.to_lower() in child.name_label.text.to_lower()) or (text.to_lower() in child.uid_label.text.to_lower()):
child.show()
else:
child.hide()
else:
for child in punish_container.get_children():
if child is PunishShowcase:
child.show()
+1
View File
@@ -0,0 +1 @@
uid://bt5wd8qjaevk0
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cbq650vxvsxw1"
path="res://.godot/imported/speaker.png-045bf6684b83b55b088824f14e175d16.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://speaker.png"
dest_files=["res://.godot/imported/speaker.png-045bf6684b83b55b088824f14e175d16.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://o2sjogt3b0ht"
path="res://.godot/imported/tf2logo.png-5b6963627dd432a7b538e7f5c69f00b3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tf2logo.png"
dest_files=["res://.godot/imported/tf2logo.png-5b6963627dd432a7b538e7f5c69f00b3.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
+1
View File
@@ -0,0 +1 @@
Nothing! 🥣🐁