Я разрабатываю мод для игры «кислород не включен». < /p>
Мое ожидание - иметь совершенно новое здание и меню с 8 кнопками в меню. Нажатие кнопки изменит цвет. Предыдущие функции были реализованы, но функция «Цвет изменения кнопки» не может быть реализована после многих попыток. 2: изображения загружаются правильно.using HarmonyLib;
using KMod;
using KSerialization;
using LaserHeater;
using PeterHan.PLib.Core;
using PeterHan.PLib.Database;
using PeterHan.PLib.PatchManager;
using PeterHan.PLib.UI;
using STRINGS;
using System;
using System.Collections.Generic;
using System.IO;
using TUNING;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using static System.Net.Mime.MediaTypeNames;
public static class StringUtils
{
public static void AddBuildingStrings(
string buildingId,
string name,
string description,
string effect)
{
Strings.Add($"STRINGS.BUILDINGS.PREFABS.{buildingId.ToUpperInvariant()}.NAME", STRINGS.UI.FormatAsLink(name, buildingId));
Strings.Add($"STRINGS.BUILDINGS.PREFABS.{buildingId.ToUpperInvariant()}.DESC", description);
Strings.Add($"STRINGS.BUILDINGS.PREFABS.{buildingId.ToUpperInvariant()}.EFFECT", effect);
}
public static void AddStatusItemStrings(string id, string prefix, string name, string tooltip)
{
Strings.Add($"STRINGS.{prefix.ToUpperInvariant()}.STATUSITEMS.{id.ToUpperInvariant()}.NAME", name);
Strings.Add($"STRINGS.{prefix.ToUpperInvariant()}.STATUSITEMS.{id.ToUpperInvariant()}.TOOLTIP", tooltip);
}
public static void AddSideScreenStrings(string key, string title, string tooltip)
{
Strings.Add($"STRINGS.UI.UISIDESCREENS.{key.ToUpperInvariant()}.TITLE", title);
Strings.Add($"STRINGS.UI.UISIDESCREENS.{key.ToUpperInvariant()}.TOOLTIP", tooltip);
}
}
public static class BuildingUtils
{
private static PlanScreen.PlanInfo GetMenu(HashedString category)
{
foreach (PlanScreen.PlanInfo menu in TUNING.BUILDINGS.PLANORDER)
{
if (menu.category == category)
return menu;
}
throw new Exception("The plan menu was not found in TUNING.BUILDINGS.PLANORDER.");
}
public static void AddBuildingToPlanScreen(
string buildingID,
HashedString category,
string addAferID = null)
{
List data = BuildingUtils.GetMenu(category).data;
if (data == null)
return;
if (addAferID != null)
{
int num = data.IndexOf(addAferID);
if (num == -1 || num == data.Count - 1)
data.Add(buildingID);
else
data.Insert(num + 1, buildingID);
}
else
data.Add(buildingID);
}
public static void AddBuildingToTech(string buildingID, string techID)
{
Db.Get().Techs.Get(techID)?.unlockedItemIDs.Add(buildingID);
}
}
namespace LaserHeater
{
public class LaserHeaterConfig : IBuildingConfig
{
public const string ID = "LaserHeater";
public const string NAME = "Laser Heater";
public const string DESC = "Laser Heater TEST";
public const string EFFECT = "I DON'T KNOW";
public override BuildingDef CreateBuildingDef()
{
int width = 1;
int height = 2;
string anim = "LaserHeater_kanim";
string[] MaterialCategory = new string[1] { "DIAMOND" };
int hitpoints = 30;
float construction_time = 30f;
float[] construction_mass = new float[1] { 1f };
float melting_point = 9999f;
BuildLocationRule build_location_rule = BuildLocationRule.Anywhere;
EffectorValues none = NOISE_POLLUTION.NONE;
BuildingDef buildingDef = BuildingTemplates.CreateBuildingDef("LaserHeater", width, height, anim, hitpoints, construction_time, construction_mass, MaterialCategory, melting_point, build_location_rule, TUNING.BUILDINGS.DECOR.PENALTY.TIER1, none);
buildingDef.Floodable = false;
buildingDef.AudioCategory = "Metal";
buildingDef.Overheatable = true;
buildingDef.Repairable = false;
buildingDef.Disinfectable = false;
buildingDef.Invincible = true;
buildingDef.LogicInputPorts = LogicOperationalController.CreateSingleInputPortList(new CellOffset(0, 0));
buildingDef.PowerInputOffset = new CellOffset(0, 0);
buildingDef.SceneLayer = Grid.SceneLayer.Building;
buildingDef.ForegroundLayer = Grid.SceneLayer.BuildingFront;
buildingDef.RequiresPowerInput = true;
buildingDef.SelfHeatKilowattsWhenActive = 100f;
buildingDef.EnergyConsumptionWhenActive = 1800f;
buildingDef.OverheatTemperature = 2000f;
buildingDef.DragBuild = true;
buildingDef.PermittedRotations = PermittedRotations.R360;
return buildingDef;
}
public override void ConfigureBuildingTemplate(GameObject go, Tag prefab_tag)
{
}
public override void DoPostConfigureComplete(GameObject go)
{
go.AddOrGet();
}
}
public class LaserHeaterSideScreen : SideScreenContent
{
private LaserHeater Heater;
private string selectedDirection = "N";
private List buttonObjects = new List();
private List arrowSprite_act = new List();
private List arrowSprite_inact = new List();
private List PButtons = new List();
protected override void OnPrefabInit()
{
base.OnPrefabInit();
string DllPath = this.GetType().Assembly.Location;
string imagePath = DllPath.Replace("LaserHeater.dll", "");
Debug.Log("LaserHeaterSideScreen Prefab Init Log," + imagePath);
var panel = new PGridPanel("ConfigPanel")
{
FlexSize = Vector2.one
};
// 添加3列和3行
panel.AddColumn(new GridColumnSpec());
panel.AddColumn(new GridColumnSpec());
panel.AddColumn(new GridColumnSpec());
panel.AddRow(new GridRowSpec());
panel.AddRow(new GridRowSpec());
panel.AddRow(new GridRowSpec());
string[] directions = { "NW", "N", "NE", "W", "E", "SW", "S", "SE" };
ColorStyleSetting mColor = ScriptableObject.CreateInstance();
int[] columns = { 0, 1, 2, 0, 2, 0, 1, 2 };
int[] rows = { 0, 0, 0, 1, 1, 2, 2, 2 };
for (int i = 0; i < 8; i++)
{
byte[] imageBytes = File.ReadAllBytes(imagePath + @"\assets\" + directions + "_ACT.png");
Texture2D tex = new Texture2D(2, 2);
tex.LoadImage(imageBytes);
arrowSprite_act.Add( Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f)));
byte[] imageBytes_inact = File.ReadAllBytes(imagePath + @"\assets\" + directions + "_INACT.png");
Texture2D tex_inact = new Texture2D(2, 2);
tex_inact.LoadImage(imageBytes_inact);
arrowSprite_inact.Add(Sprite.Create(tex_inact, new Rect(0, 0, tex_inact.width, tex_inact.height), new Vector2(0.5f, 0.5f)));
PButtons.Add(new PButton("DirectionButton" + i.ToString())
{
ToolTip = "Select direction " + directions,
Margin = new RectOffset(5, 15, 5, 15),
Color = mColor,
Sprite = arrowSprite_inact,
}
);
switch (i)
{
case 0:
PButtons.OnClick = OnButtonClick_NW;
break;
case 1:
PButtons.OnClick = OnButtonClick_N;
break;
case 2:
PButtons.OnClick = OnButtonClick_NE;
break;
case 3:
PButtons.OnClick = OnButtonClick_W;
break;
case 4:
PButtons.OnClick = OnButtonClick_E;
break;
case 5:
PButtons.OnClick = OnButtonClick_SW;
break;
case 6:
PButtons[i].OnClick = OnButtonClick_S;
break;
case 7:
PButtons[i].OnClick = OnButtonClick_SE;
break;
}
panel.AddChild(PButtons[i], new GridComponentSpec(rows[i], columns[i]));
buttonObjects.Add(PButtons[i].Build());
}
var content = panel.Build();
content.transform.SetParent(gameObject.transform, false);
ContentContainer = content;
}
private void OnButtonClick_NW(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(0);
Refresh();
}
}
private void OnButtonClick_N(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(1);
Refresh();
}
}
private void OnButtonClick_NE(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(2);
Refresh();
}
}
private void OnButtonClick_W(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(3);
Refresh();
}
}
private void OnButtonClick_E(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(4);
Refresh();
}
}
private void OnButtonClick_SW(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(5);
Refresh();
}
}
private void OnButtonClick_S(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(6);
Refresh();
}
}
private void OnButtonClick_SE(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(7);
Refresh();
}
}
public override void SetTarget(GameObject target)
{
base.SetTarget(target);
Heater = target.GetComponent();
this.Build();
}
private void Build() => this.Refresh();
public override bool IsValidForTarget(GameObject target)
{
Heater = target.GetComponent();
if (Heater != null)
{
Refresh();
return true;
}
return false;
}
protected override void OnSpawn()
{
base.OnSpawn();
}
private void Refresh()
{
if (Heater != null && PButtons.Count > 0)
{
int Dir = Heater.GetDirection();
for (int i = 0; i < 8; i++)
{
Sprite component = buttonObjects[i].GetComponent();
if (i == Dir)
{
component = arrowSprite_act[i];
Debug.Log("act:" + buttonObjects[i].name + ", sprite :" + component.ToString());
}
else
{
component = arrowSprite_inact[i];
Debug.Log("in_act:" + buttonObjects[i].name + ", sprite :" + component.ToString());
}
}
}
}
public override string GetTitle() => (string)"Set Direction";
}
public class LaserHeater : KMonoBehaviour
{
private bool[] Direction = {false, true, false, false, false, false, false, false };
protected override void OnSpawn()
{
base.OnSpawn();
}
public void Update()
{
}
public void SetDirection(int Dir)
{
for (int i = 0; i < 8; i++)
{
if (i == Dir)
Direction[i] = true;
else
Direction[i] = false;
}
}
public int GetDirection()
{
for (int i = 0; i < 8; i++)
{
if (Direction[i] == true)
return i;
}
return -1;
}
}
}
public class Patches : UserMod2
{
public override void OnLoad(Harmony harmony)
{
base.OnLoad(harmony);
PUtil.InitLibrary(false);
PUIUtils.AddSideScreenContent();
}
[HarmonyPatch(typeof(Db))]
[HarmonyPatch("Initialize")]
public class Db_Initialize_Patch
{
public static void Prefix()
{
Debug.Log("Add Building Pre Fix");
StringUtils.AddBuildingStrings("LaserHeater", (string)LaserHeater.LaserHeaterConfig.NAME, (string)LaserHeater.LaserHeaterConfig.DESC, (string)LaserHeater.LaserHeaterConfig.EFFECT);
}
public static void Postfix()
{
BuildingUtils.AddBuildingToPlanScreen("LaserHeater", (HashedString)"HEP");
BuildingUtils.AddBuildingToTech("LaserHeater", "NuclearResearch");
}
}
[HarmonyPatch(typeof(DetailsScreen), "OnPrefabInit")]
public static class DetailsScreen_Patch
{
public static void Postfix()
{
PUIUtils.AddSideScreenContent();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... e-in-unity
Как изменить изображение спрайта в единстве? ⇐ C#
Место общения программистов C#
-
Anonymous
1753646046
Anonymous
Я разрабатываю мод для игры «кислород не включен». < /p>
Мое ожидание - иметь совершенно новое здание и меню с 8 кнопками в меню. Нажатие кнопки изменит цвет. Предыдущие функции были реализованы, но функция «Цвет изменения кнопки» не может быть реализована после многих попыток. 2: изображения загружаются правильно.using HarmonyLib;
using KMod;
using KSerialization;
using LaserHeater;
using PeterHan.PLib.Core;
using PeterHan.PLib.Database;
using PeterHan.PLib.PatchManager;
using PeterHan.PLib.UI;
using STRINGS;
using System;
using System.Collections.Generic;
using System.IO;
using TUNING;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using static System.Net.Mime.MediaTypeNames;
public static class StringUtils
{
public static void AddBuildingStrings(
string buildingId,
string name,
string description,
string effect)
{
Strings.Add($"STRINGS.BUILDINGS.PREFABS.{buildingId.ToUpperInvariant()}.NAME", STRINGS.UI.FormatAsLink(name, buildingId));
Strings.Add($"STRINGS.BUILDINGS.PREFABS.{buildingId.ToUpperInvariant()}.DESC", description);
Strings.Add($"STRINGS.BUILDINGS.PREFABS.{buildingId.ToUpperInvariant()}.EFFECT", effect);
}
public static void AddStatusItemStrings(string id, string prefix, string name, string tooltip)
{
Strings.Add($"STRINGS.{prefix.ToUpperInvariant()}.STATUSITEMS.{id.ToUpperInvariant()}.NAME", name);
Strings.Add($"STRINGS.{prefix.ToUpperInvariant()}.STATUSITEMS.{id.ToUpperInvariant()}.TOOLTIP", tooltip);
}
public static void AddSideScreenStrings(string key, string title, string tooltip)
{
Strings.Add($"STRINGS.UI.UISIDESCREENS.{key.ToUpperInvariant()}.TITLE", title);
Strings.Add($"STRINGS.UI.UISIDESCREENS.{key.ToUpperInvariant()}.TOOLTIP", tooltip);
}
}
public static class BuildingUtils
{
private static PlanScreen.PlanInfo GetMenu(HashedString category)
{
foreach (PlanScreen.PlanInfo menu in TUNING.BUILDINGS.PLANORDER)
{
if (menu.category == category)
return menu;
}
throw new Exception("The plan menu was not found in TUNING.BUILDINGS.PLANORDER.");
}
public static void AddBuildingToPlanScreen(
string buildingID,
HashedString category,
string addAferID = null)
{
List data = BuildingUtils.GetMenu(category).data;
if (data == null)
return;
if (addAferID != null)
{
int num = data.IndexOf(addAferID);
if (num == -1 || num == data.Count - 1)
data.Add(buildingID);
else
data.Insert(num + 1, buildingID);
}
else
data.Add(buildingID);
}
public static void AddBuildingToTech(string buildingID, string techID)
{
Db.Get().Techs.Get(techID)?.unlockedItemIDs.Add(buildingID);
}
}
namespace LaserHeater
{
public class LaserHeaterConfig : IBuildingConfig
{
public const string ID = "LaserHeater";
public const string NAME = "Laser Heater";
public const string DESC = "Laser Heater TEST";
public const string EFFECT = "I DON'T KNOW";
public override BuildingDef CreateBuildingDef()
{
int width = 1;
int height = 2;
string anim = "LaserHeater_kanim";
string[] MaterialCategory = new string[1] { "DIAMOND" };
int hitpoints = 30;
float construction_time = 30f;
float[] construction_mass = new float[1] { 1f };
float melting_point = 9999f;
BuildLocationRule build_location_rule = BuildLocationRule.Anywhere;
EffectorValues none = NOISE_POLLUTION.NONE;
BuildingDef buildingDef = BuildingTemplates.CreateBuildingDef("LaserHeater", width, height, anim, hitpoints, construction_time, construction_mass, MaterialCategory, melting_point, build_location_rule, TUNING.BUILDINGS.DECOR.PENALTY.TIER1, none);
buildingDef.Floodable = false;
buildingDef.AudioCategory = "Metal";
buildingDef.Overheatable = true;
buildingDef.Repairable = false;
buildingDef.Disinfectable = false;
buildingDef.Invincible = true;
buildingDef.LogicInputPorts = LogicOperationalController.CreateSingleInputPortList(new CellOffset(0, 0));
buildingDef.PowerInputOffset = new CellOffset(0, 0);
buildingDef.SceneLayer = Grid.SceneLayer.Building;
buildingDef.ForegroundLayer = Grid.SceneLayer.BuildingFront;
buildingDef.RequiresPowerInput = true;
buildingDef.SelfHeatKilowattsWhenActive = 100f;
buildingDef.EnergyConsumptionWhenActive = 1800f;
buildingDef.OverheatTemperature = 2000f;
buildingDef.DragBuild = true;
buildingDef.PermittedRotations = PermittedRotations.R360;
return buildingDef;
}
public override void ConfigureBuildingTemplate(GameObject go, Tag prefab_tag)
{
}
public override void DoPostConfigureComplete(GameObject go)
{
go.AddOrGet();
}
}
public class LaserHeaterSideScreen : SideScreenContent
{
private LaserHeater Heater;
private string selectedDirection = "N";
private List buttonObjects = new List();
private List arrowSprite_act = new List();
private List arrowSprite_inact = new List();
private List PButtons = new List();
protected override void OnPrefabInit()
{
base.OnPrefabInit();
string DllPath = this.GetType().Assembly.Location;
string imagePath = DllPath.Replace("LaserHeater.dll", "");
Debug.Log("LaserHeaterSideScreen Prefab Init Log," + imagePath);
var panel = new PGridPanel("ConfigPanel")
{
FlexSize = Vector2.one
};
// 添加3列和3行
panel.AddColumn(new GridColumnSpec());
panel.AddColumn(new GridColumnSpec());
panel.AddColumn(new GridColumnSpec());
panel.AddRow(new GridRowSpec());
panel.AddRow(new GridRowSpec());
panel.AddRow(new GridRowSpec());
string[] directions = { "NW", "N", "NE", "W", "E", "SW", "S", "SE" };
ColorStyleSetting mColor = ScriptableObject.CreateInstance();
int[] columns = { 0, 1, 2, 0, 2, 0, 1, 2 };
int[] rows = { 0, 0, 0, 1, 1, 2, 2, 2 };
for (int i = 0; i < 8; i++)
{
byte[] imageBytes = File.ReadAllBytes(imagePath + @"\assets\" + directions[i] + "_ACT.png");
Texture2D tex = new Texture2D(2, 2);
tex.LoadImage(imageBytes);
arrowSprite_act.Add( Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f)));
byte[] imageBytes_inact = File.ReadAllBytes(imagePath + @"\assets\" + directions[i] + "_INACT.png");
Texture2D tex_inact = new Texture2D(2, 2);
tex_inact.LoadImage(imageBytes_inact);
arrowSprite_inact.Add(Sprite.Create(tex_inact, new Rect(0, 0, tex_inact.width, tex_inact.height), new Vector2(0.5f, 0.5f)));
PButtons.Add(new PButton("DirectionButton" + i.ToString())
{
ToolTip = "Select direction " + directions[i],
Margin = new RectOffset(5, 15, 5, 15),
Color = mColor,
Sprite = arrowSprite_inact[i],
}
);
switch (i)
{
case 0:
PButtons[i].OnClick = OnButtonClick_NW;
break;
case 1:
PButtons[i].OnClick = OnButtonClick_N;
break;
case 2:
PButtons[i].OnClick = OnButtonClick_NE;
break;
case 3:
PButtons[i].OnClick = OnButtonClick_W;
break;
case 4:
PButtons[i].OnClick = OnButtonClick_E;
break;
case 5:
PButtons[i].OnClick = OnButtonClick_SW;
break;
case 6:
PButtons[i].OnClick = OnButtonClick_S;
break;
case 7:
PButtons[i].OnClick = OnButtonClick_SE;
break;
}
panel.AddChild(PButtons[i], new GridComponentSpec(rows[i], columns[i]));
buttonObjects.Add(PButtons[i].Build());
}
var content = panel.Build();
content.transform.SetParent(gameObject.transform, false);
ContentContainer = content;
}
private void OnButtonClick_NW(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(0);
Refresh();
}
}
private void OnButtonClick_N(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(1);
Refresh();
}
}
private void OnButtonClick_NE(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(2);
Refresh();
}
}
private void OnButtonClick_W(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(3);
Refresh();
}
}
private void OnButtonClick_E(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(4);
Refresh();
}
}
private void OnButtonClick_SW(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(5);
Refresh();
}
}
private void OnButtonClick_S(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(6);
Refresh();
}
}
private void OnButtonClick_SE(GameObject target)
{
if (Heater != null)
{
Heater.SetDirection(7);
Refresh();
}
}
public override void SetTarget(GameObject target)
{
base.SetTarget(target);
Heater = target.GetComponent();
this.Build();
}
private void Build() => this.Refresh();
public override bool IsValidForTarget(GameObject target)
{
Heater = target.GetComponent();
if (Heater != null)
{
Refresh();
return true;
}
return false;
}
protected override void OnSpawn()
{
base.OnSpawn();
}
private void Refresh()
{
if (Heater != null && PButtons.Count > 0)
{
int Dir = Heater.GetDirection();
for (int i = 0; i < 8; i++)
{
Sprite component = buttonObjects[i].GetComponent();
if (i == Dir)
{
component = arrowSprite_act[i];
Debug.Log("act:" + buttonObjects[i].name + ", sprite :" + component.ToString());
}
else
{
component = arrowSprite_inact[i];
Debug.Log("in_act:" + buttonObjects[i].name + ", sprite :" + component.ToString());
}
}
}
}
public override string GetTitle() => (string)"Set Direction";
}
public class LaserHeater : KMonoBehaviour
{
private bool[] Direction = {false, true, false, false, false, false, false, false };
protected override void OnSpawn()
{
base.OnSpawn();
}
public void Update()
{
}
public void SetDirection(int Dir)
{
for (int i = 0; i < 8; i++)
{
if (i == Dir)
Direction[i] = true;
else
Direction[i] = false;
}
}
public int GetDirection()
{
for (int i = 0; i < 8; i++)
{
if (Direction[i] == true)
return i;
}
return -1;
}
}
}
public class Patches : UserMod2
{
public override void OnLoad(Harmony harmony)
{
base.OnLoad(harmony);
PUtil.InitLibrary(false);
PUIUtils.AddSideScreenContent();
}
[HarmonyPatch(typeof(Db))]
[HarmonyPatch("Initialize")]
public class Db_Initialize_Patch
{
public static void Prefix()
{
Debug.Log("Add Building Pre Fix");
StringUtils.AddBuildingStrings("LaserHeater", (string)LaserHeater.LaserHeaterConfig.NAME, (string)LaserHeater.LaserHeaterConfig.DESC, (string)LaserHeater.LaserHeaterConfig.EFFECT);
}
public static void Postfix()
{
BuildingUtils.AddBuildingToPlanScreen("LaserHeater", (HashedString)"HEP");
BuildingUtils.AddBuildingToTech("LaserHeater", "NuclearResearch");
}
}
[HarmonyPatch(typeof(DetailsScreen), "OnPrefabInit")]
public static class DetailsScreen_Patch
{
public static void Postfix()
{
PUIUtils.AddSideScreenContent();
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79716654/how-to-change-sprite-image-in-unity[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия